安卓+thinkphp3.2集成支付宝接口

2023-12-05 14:30

本文主要是介绍安卓+thinkphp3.2集成支付宝接口,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.序言

快捷支付的势头已经越来越猛,在企业中,学会如何集成支付功能,是必备不可的技能。这里我来详细教学支付宝安卓端的集成过程,希望对大家有所帮助。

2.注册支付宝企业账户

这里支付宝的注册就不多说了,自己正常操作步骤进行,不懂的可以上网查找。

3.创建支付宝应用

3.1登录支付宝开发平台

3.2创建应用

3.2.1创建应用并获取APPID

点击开发者中心=>支付接入=>创建应用

3.2.2添加app支付功能

我们集成安卓支付接口,所需要的功能如下:

3.2.3签约

我们添加完功能后,进行功能服务的签约,其它我不说什么了,其中会叫你写一份文档申请,这里我给一个以前我写的demo,大家可以照着上面进行申请:

3.2.4配置密钥

1.支付宝密钥处理体系:

2.密钥包含:

应用公钥:由商户自己生成的RSA公钥(与应用私钥必须匹配),商户需上传应用公钥到支付宝开放平台,以便支付宝使用该公钥验证该交易是否是商户发起的。

应用私钥:由商户自己生成的RSA私钥(与应用公钥必须匹配),商户开发者使用应用私钥对请求字符串进行加签。

支付宝公钥:支付宝的RSA公钥,商户使用该公钥验证该结果是否是支付宝返回的。

在支付宝开放平台下载生成公私钥工具(下载链接),我使用的RSA的1024,相较于2048安全方面没有2048好:

生成好的公私钥,在开发设置中配置:

4.集成和开发

接入移动支付需要集成两个SDK,客户端SDK需要集成在商户自己的APP中,用于唤起支付宝APP并发送交易数据,并在支付宝APP返回商户APP时获得支付结果。服务端SDK需要商户集成在自己的服务端系统中,用于协助解析并验证客户端同步返回的支付结果和异步通知。

4.1开发支付的业务逻辑

4.2集成支付宝sdk

4.2.1下载支付宝安卓demo

1.首先,我们先下载个支付宝安卓demo作参考(下载地址):

2.用andriod studio打开解压的alipay_demo,下面我们需要四个东西(appid、pid、target_id、rsa密钥):

其中pid如何获取:

安卓支付配置:

3.填写好参数后,试一试在手机上运行,是否能够成功,下面是成功画面:

4.安卓前端参数代码分析

通过注释,我们很快能找到支付功能的代码所在,我们可以Log看下orderInfo参数构成,帮助我们在后端拼接

orderInfo的参数示例:

①请求参数按照key=value&key=value方式拼接的未签名原始字符串:

app_id=2015052600090779&biz_content={"timeout_express":"30m","product_code":"QUICK_MSECURITY_PAY","total_amount":"0.01","subject":"1","body":"我是测试数据","out_trade_no":"IQJZSRC1YMQB5HU"}&charset=utf-8&format=json&method=alipay.trade.app.pay&notify_url=http://domain.merchant.com/payment_notify&sign_type=RSA2&timestamp=2016-08-25 20:26:31&version=1.0

②再对原始字符串进行签名

app_id=2015052600090779&biz_content={"timeout_express":"30m","product_code":"QUICK_MSECURITY_PAY","total_amount":"0.01","subject":"1","body":"我是测试数据","out_trade_no":"IQJZSRC1YMQB5HU"}&charset=utf-8&format=json&method=alipay.trade.app.pay&notify_url=http://domain.merchant.com/payment_notify&sign_type=RSA2&timestamp=2016-08-25 20:26:31&version=1.0&sign=cYmuUnKi5QdBsoZEAbMXVMmRWjsuUj+y48A2DvWAVVBuYkiBj13CFDHu2vZQvmOfkjE0YqCUQE04kqm9Xg3tIX8tPeIGIFtsIyp/M45w1ZsDOiduBbduGfRo1XRsvAyVAv2hCrBLLrDI5Vi7uZZ77Lo5J0PpUUWwyQGt0M4cj8g=

③最后对请求字符串的所有一级value(biz_content作为一个value)进行encode,编码格式按请求串中的charset为准,没传charset按UTF-8处理,获得最终的请求字符串:

app_id=2015052600090779&biz_content=%7B%22timeout_express%22%3A%2230m%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22total_amount%22%3A%220.01%22%2C%22subject%22%3A%221%22%2C%22body%22%3A%22%E6%88%91%E6%98%AF%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE%22%2C%22out_trade_no%22%3A%22IQJZSRC1YMQB5HU%22%7D&charset=utf-8&format=json&method=alipay.trade.app.pay&notify_url=http%3A%2F%2Fdomain.merchant.com%2Fpayment_notify&sign_type=RSA2&timestamp=2016-08-25%2020%3A26%3A31&version=1.0&sign=cYmuUnKi5QdBsoZEAbMXVMmRWjsuUj%2By48A2DvWAVVBuYkiBj13CFDHu2vZQvmOfkjE0YqCUQE04kqm9Xg3tIX8tPeIGIFtsIyp%2FM45w1ZsDOiduBbduGfRo1XRsvAyVAv2hCrBLLrDI5Vi7uZZ77Lo5J0PpUUWwyQGt0M4cj8g%3D

4.2.2下载支付宝php的sdk

前端安卓的代码前面我们分析完了,现在主要工作就是,我们通过支付宝服务端sdk,后端生成一个前面说到orderInfo这个参数。支付宝php集成sdk,因为支付宝原本php端的sdk太多了,我把专门负责支付模块的sdk提取了出来(下载链接),如果自己需要更多的功能,可以自己再从原sdk中提取。

1.在Thinkphp框架的vender中,放入支付宝php的sdk(注:sdk中的命名空间是我的,直接用就行。如果你从其他地方下载的资源,自行修改

2.服务端参数配置

3.服务端代码实现

在自己的控制器中,添加代码,代码里面注释很详细,可以仔细看一下

//在类初始化方法中,引入相关类库public function _initialize() {vendor('Alipay.AopClient');vendor('Alipay.OrderQuery');vendor('Alipay.ToaccountTransfer');vendor('Alipay.AlipayNotify');vendor('Alipay.AlipayRsa');}

支付功能实现代码:

    /*** 构造ordeInfo参数,支付功能* @post orderNum 订单号* @post money 支付费用* return ordeInfo参数*/public function alipay_before() {$alipay_config = C('alipay_config');//C方法获取配置参数$order = D('task');$data = $order -> create();$condition['orderNum'] = $data['orderNum'];//查找订单号$order_info = $order -> where($condition) -> find();$order_num = $data['orderNum'];$biz_content = Array("timeout_express" => "10m", //该笔订单允许的最晚付款时间,逾期将关闭交易"product_code" => "QUICK_MSECURITY_PAY", //销售产品码"total_amount" => $data['money'], //支付费用"subject" => "Near近你所能", //标题"body" => $order_info['taskName'], //内容"out_trade_no" => $order_num, //商户网站唯一订单号);$method = 'alipay.trade.app.pay';$timestamp = date("Y-m-d H:i:s");//构造要请求的参数数组,无需改动$parameter = Array("app_id" => $alipay_config['app_id'], //appid"biz_content" => json_encode($biz_content), //请求参数的集合"charset" => $alipay_config['input_charset'], //参数编码字符集"method" => $method, //接口名称"notify_url" => $alipay_config['notify_url'], //服务器异步通知页面路径"sign_type" => $alipay_config['sign_type'], //签名算法类型"timestamp" => $timestamp, //发送请求的时间"version" => $alipay_config['api_version'], //调用的接口版本,固定为:1.0);$alipay = new \Vendor\AlipayNotify\AlipayNotify();//将post接收到的数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串。$datainfo = $alipay -> createLinkstring($parameter, true);//将待签名字符串使用私钥签名,且做urlencode. 注意:请求到支付宝只需要做一次urlencode.$aop = new \Vendor\AopClient\AopClient();$alipay_rsa = new \Vendor\AlipayRsa\AlipayRsa();$rsa_sign = stripslashes(urlencode($alipay_rsa->rsaSign($datainfo, $alipay_config['private_key'])));//把签名得到的sign和签名类型sign_type拼接在待签名字符串后面。$parameter = Array("app_id" => urlencode($alipay_config['app_id']), //appid"biz_content" => urlencode(json_encode($biz_content)), //请求参数的集合"charset" => urlencode($alipay_config['input_charset']), //参数编码字符集"method" => urlencode($method), //接口名称"notify_url" => urlencode($alipay_config['notify_url']), //服务器异步通知页面路径"sign_type" => urlencode($alipay_config['sign_type']), //签名算法类型"timestamp" => urlencode($timestamp), //发送请求的时间"version" => urlencode($alipay_config['api_version']), //调用的接口版本,固定为:1.0);$datainfo = $alipay -> createLinkstring($parameter, true);$datainfo = $datainfo . '&sign=' . $rsa_sign;//返回给客户端,建议在客户端使用私钥对应的公钥做一次验签,保证不是他人传输。$result = array('orderinfo' => $datainfo);echo stripcslashes(json_encode($result));}

用户提现功能实现代码(注:千万不要泄露自己的支付宝配置文件,否则可以通过下面的函数,直接转钱到其他账户):

    /*** 用户提现功能(注:转账金额最低0.1元,否则会报错不成功)* @post account 收款方账户* @post amount 转账金额* @post ordernum 订单号* return 状态*/public function withDraw() {$alipay_config = C('alipay_config');$account = I('post.account');$amount = I('post.amount');$with_draw = M('user');$condition['username'] = I('post.username');$user = $with_draw -> where($condition) -> find();if ($user['money'] < $amount) {//余额不足echo "insufficient";} else {$aop = new \Vendor\AopClient\AopClient();$aop -> gatewayUrl = 'https://openapi.alipay.com/gateway.do';$aop -> appId = $alipay_config['app_id'];$aop -> rsaPrivateKey = $alipay_config['private_key'];$aop -> alipayrsaPublicKey = $alipay_config['alipay_public_key'];$aop -> apiVersion = $alipay_config['api_version'];$aop -> signType = $alipay_config['sign_type'];$aop -> postCharset = $alipay_config['input_charset'];$aop -> format = $alipay_config['format'];$request = new \Vendor\ToaccountTransfer\AlipayFundTransToaccountTransferRequest();$order_num = I('post.ordernum');$biz_content = Array("out_biz_no" => $order_num, //商户转账唯一订单号"payee_type" => "ALIPAY_LOGONID", //收款方账户类型"payee_account" => $account, //收款方账户"amount" => $amount, //转账金额	最低0.1元"payer_show_name" => "成都未来云科技有限公司", //付款方姓名"remark" => "用户提现" //转账备注);$request -> setBizContent(json_encode($biz_content));$result = $aop -> execute($request);$responseNode = str_replace(".", "_", $request -> getApiMethodName()) . "_response";$resultCode = $result -> $responseNode -> code;if (!empty($resultCode) && $resultCode == 10000) {$tmp['money'] = $user['money'] - $amount;$with_draw -> where($condition) -> save($tmp);$withdraw_order = M('withdraw_order');$tmp2['ordernum'] = I('post.ordernum');$tmp3['status'] = 1;if($withdraw_order->where($tmp2)->save($tmp3)){echo "success";}} else {echo "error";}}}

服务端异步通知代码(注:接收程序执行完后必须打印输出“success”,如果商户反馈给芝麻信用的字符不是success这7个字符,芝麻信用服务器会不断重发通知,直到超过24小时22分钟。接收程序执行完成后,该页面不能执行页面跳转。如果执行页面跳转,芝麻信用会接收不到success字符,会被芝麻信用服务器判定为该页面程序运行出现异常,而重发处理结果通知):

	//异步接收页面public function notify_url() {$alipay_config = C('alipay_config');$alipayNotify = new \Vendor\AlipayNotify\Alipaynotify($alipay_config);$aop = new \Vendor\AopClient\AopClient();$rst = $alipayNotify -> getResponse($_POST['notify_id']);if ($rst)//判断成功之后使用getResponse方法判断是否是支付宝发来的异步通知。{//使用支付宝公钥验签$verify_result = $alipayNotify -> verifyNotify();//获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表if ($verify_result) {//支付宝交易号//			$trade_no = $_POST['trade_no'];//交易状态$trade_status = $_POST['trade_status'];if ($trade_status == 'TRADE_SUCCESS' || $trade_status == 'TRADE_FINISHED') {//支付成功:TRADE_SUCCESS   交易完成:TRADE_FINISHED//这里根据自己的业务逻辑来,写回调所要实现的功能,我的仅供参考$order = D('task');$condition['orderNum'] = $_POST['out_trade_no'];$order_info = $order -> where($condition) -> find();if ($order_info['status'] == 0) {//更新支付状态和支付时间$data['status'] = 1;$order -> where($condition) -> save($data);}}echo 'success';} else {//验证签名失败echo "fail";}} else {//不是支付宝发来异步echo "fail";}}

4.3安卓前端修改orderInfo参数

将之前安卓端的orderInfo这个参数,通过http请求后端获取这个参数,然后原本安卓自身构造参数的代码删去,就基本完成了,我们就可以通过使用支付宝支付功能了。

在支付宝异步通知代码下,实现自己的业务逻辑,保证真正支付成功,现在大功告成:

 5.成功界面展示

5.1支付界面

5.2提现界面

我自己后端还写了个审核界面,所以不会立即到账,上述的都是即时到账。

6.总结

真的希望我的学弟学妹们,真的能看到最后,我把能详细讲解的都尽量详细了。真心希望学弟学妹们有所收获,通过查看代码注释,我们分析代码,如何构造参数。不只是仅仅学会这个支付宝api,还要学会如何使用别人的api,这个过程自己好好总结一下。

这篇关于安卓+thinkphp3.2集成支付宝接口的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/qq_35447169/article/details/81872004
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/457938

相关文章

Java中的Closeable接口及常见问题

《Java中的Closeable接口及常见问题》Closeable是Java中的一个标记接口,用于表示可以被关闭的对象,它定义了一个标准的方法来释放对象占用的系统资源,下面给大家介绍Java中的Clo... 目录1. Closeable接口概述2. 主要用途3. 实现类4. 使用方法5. 实现自定义Clos

Java集成Onlyoffice的示例代码及场景分析

《Java集成Onlyoffice的示例代码及场景分析》:本文主要介绍Java集成Onlyoffice的示例代码及场景分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 需求场景:实现文档的在线编辑,团队协作总结:两个接口 + 前端页面 + 配置项接口1:一个接口,将o

Swagger2与Springdoc集成与使用详解

《Swagger2与Springdoc集成与使用详解》:本文主要介绍Swagger2与Springdoc集成与使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1. 依赖配置2. 基础配置2.1 启用 Springdoc2.2 自定义 OpenAPI 信息3.

java对接第三方接口的三种实现方式

《java对接第三方接口的三种实现方式》:本文主要介绍java对接第三方接口的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录HttpURLConnection调用方法CloseableHttpClient调用RestTemplate调用总结在日常工作

Java 的 Condition 接口与等待通知机制详解

《Java的Condition接口与等待通知机制详解》在Java并发编程里,实现线程间的协作与同步是极为关键的任务,本文将深入探究Condition接口及其背后的等待通知机制,感兴趣的朋友一起看... 目录一、引言二、Condition 接口概述2.1 基本概念2.2 与 Object 类等待通知方法的区别

Spring Boot 集成 Solr 的详细示例

《SpringBoot集成Solr的详细示例》:本文主要介绍SpringBoot集成Solr的详细示例,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录环境准备添加依赖配置 Solr 连接定义实体类编写 Repository 接口创建 Service 与 Controller示例运行

SpringBoot实现接口数据加解密的三种实战方案

《SpringBoot实现接口数据加解密的三种实战方案》在金融支付、用户隐私信息传输等场景中,接口数据若以明文传输,极易被中间人攻击窃取,SpringBoot提供了多种优雅的加解密实现方案,本文将从原... 目录一、为什么需要接口数据加解密?二、核心加解密算法选择1. 对称加密(AES)2. 非对称加密(R

Spring Boot集成SLF4j从基础到高级实践(最新推荐)

《SpringBoot集成SLF4j从基础到高级实践(最新推荐)》SLF4j(SimpleLoggingFacadeforJava)是一个日志门面(Facade),不是具体的日志实现,这篇文章主要介... 目录一、日志框架概述与SLF4j简介1.1 为什么需要日志框架1.2 主流日志框架对比1.3 SLF4

Spring Boot集成Logback终极指南之从基础到高级配置实战指南

《SpringBoot集成Logback终极指南之从基础到高级配置实战指南》Logback是一个可靠、通用且快速的Java日志框架,作为Log4j的继承者,由Log4j创始人设计,:本文主要介绍... 目录一、Logback简介与Spring Boot集成基础1.1 Logback是什么?1.2 Sprin

Java对接Dify API接口的完整流程

《Java对接DifyAPI接口的完整流程》Dify是一款AI应用开发平台,提供多种自然语言处理能力,通过调用Dify开放API,开发者可以快速集成智能对话、文本生成等功能到自己的Java应用中,本... 目录Java对接Dify API接口完整指南一、Dify API简介二、准备工作三、基础对接实现1.