ThinkPHP5.0 实现 app支付宝支付功能
前几天做APP开发,用到了支付宝接口,简单写一下我做的APP接入支付宝支付的过程,希望对做APP支付宝支付的童鞋有帮助,
不懂的可以先去支付平台看一下支付宝支付的文档,我是下的demo看的,这个是用tp5.0做的,先上图:

至于支付接口的接口包文件自己下吧,这个我就不提供地址链接了,这个支付接口我用的是异步回调,好像现在版本的支付宝同步回调只能用来跳转页面用了,哎,不说了,看代码吧。
做这个支付宝支付我总共用到了三个控制器:
1:支付宝支付控制器。
2:支付宝支付配置参数控制器。
3:支付宝回调地址控制器。
好了,首先创建个支付宝支付的控制器,是由上个页面选择好支付方式之后确认支付后需要经过的控制器(这里选择的是支付宝支付),代码 如下:
1 <?php
2 namespace app\mobile\controller;
3 use app\mobile\model\Goods;
4 use app\mobile\model\OrderGoods;
5 use think\Controller;
6
7 class Pay extends Controller
8 {
9 public function pay_order()
10 {
11 $res = new OrderGoods();
12 //获取订单号
13 $where['id'] = input('post.order_sn');
14 $reoderSn = input('post.order_sn');
15 //查询订单信息
16 $order_info = $res->where($where)->find();
17 //获取支付方式
18 $pay_type = input('post.pay_type');//微信支付 或者支付宝支付
19 //获取支付金额
20 $money = input('post.totle_sum');
21 //判断支付方式
22 switch ($pay_type) {
23 case 'ali';//如果支付方式为支付宝支付
24
25 //更新支付方式为支付宝
26 $type['pay_type'] = 'ali';
27 $res->where($where)->update($type);
28
29 //实例化alipay类
30 $ali = new Alipay();
31
32 //异步回调地址
33 $url = 'XXXXXXXXXXXXXXXXXX/Callback/aliPayBack';
34
35 $array = $ali->alipay('商品名称', $money,$reoderSn, $url);
36
37 if ($array) {
38 return $array;
39 } else {
40 echo json_encode(array('status' => 0, 'msg' => '对不起请检查相关参数!@'));
41 }
42 break;
43 case 'wx';
44
45 break;
46 }
47 }
48 }
然后又创建了一个Alipay控制器,写支付宝配置参数,代码如下:
1 class AliPay extends Controller
2 {
3
4 protected $appId = '';//支付宝AppId
5 protected $rsaPrivateKey = '';//支付宝私钥
6 protected $aliPayRsaPublicKey = '';//支付宝公钥
7 private $seller = '';
8
9 /*
10 * 支付宝支付
11 */
12 public function aliPay($body, $total_amount, $product_code, $notify_url)
13 {
14 /**
15 * 调用支付宝接口。
16 */
17 /*import('.Alipay.aop.AopClient', '', '.php');
18 import('.Alipay.aop.request.AlipayTradeAppPayRequest', '', '.php');*/
19 Loader::import('Alipay\aop\AopClient', EXTEND_PATH);
20 Loader::import('Alipay\aop\request\AlipayTradeAppPayRequest', EXTEND_PATH);
21
22 $aop = new \AopClient();
23
24 $aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";
25 $aop->appId = $this->appId;
26 $aop->rsaPrivateKey = $this->rsaPrivateKey;
27 $aop->format = "json";
28 $aop->charset = "UTF-8";
29 $aop->signType = "RSA2";
30 $aop->alipayrsaPublicKey = $this->aliPayRsaPublicKey;
31 $request = new \AlipayTradeAppPayRequest();
32 $arr['body'] = $body;
33 $arr['subject'] = $body;
34 $arr['out_trade_no'] = $product_code;
35 $arr['timeout_express'] = '30m';
36 $arr['total_amount'] = floatval($total_amount);
37 $arr['product_code'] = 'QUICK_MSECURITY_PAY';
38
39 $json = json_encode($arr);
40 $request->setNotifyUrl($notify_url);
41 $request->setBizContent($json);
42
43 $response = $aop->sdkExecute($request);
44 return $response;
45
46 }
47
48
49 function createLinkstring($para)
50 {
51 $arg = "";
52 while (list ($key, $val) = each($para)) {
53 $arg .= $key . "=" . $val . "&";
54 }
55 //去掉最后一个&字符
56 $arg = substr($arg, 0, count($arg) - 2);
57
58 //如果存在转义字符,那么去掉转义
59 if (get_magic_quotes_gpc()) {
60 $arg = stripslashes($arg);
61 }
62
63 return $arg;
64 }
65
66
67 function argSort($para)
68 {
69 ksort($para);
70 reset($para);
71 return $para;
72 }
73 }
Alipay支付demo我放在extend目录下了,用这种方法来实现支付宝支付的话,上面的那个支付宝配置参数控制器的内容除了支付宝Appid,支付宝公钥,私钥,收款人账号,其他的照搬下来就行了,现在已经写了两个控制器了,接下来还有一个异步回调地址。这个异步回调有点坑了,支付成功有时候就是不回调,先上代码吧
1 <?php
2 namespace app\mobile\controller;
3 use app\mobile\model\OrderGoods;
4 use app\mobile\model\IntegralRecord;
5 use app\admin\model\SystemSettings;
6 use app\mobile\model\Members;
7 use think\Controller;
8 use think\Request;
9 use think\Db;
10
11 class Callback extends Controller
12 {
13 /*
14 * 支付宝支付回调修改订单状态
15 */
16 public function aliPayBack()
17 {
18
19 if ($_POST['trade_status'] == 'TRADE_SUCCESS') {//如果支付成功
20 //===============修改订单状态===========================//
21 $order = new OrderGoods();//实例化
22 $orderSn = $_POST['out_trade_no'];//获取订单号
23 $where['order_sn'] = $orderSn;
24 $data1['type'] = 2;
25 $order->where($where)->update($data1);//修改订单状态
26 echo 'success';
27 exit;
28 }
29 }
30 }
OK现在代码写完了。执行支付宝支付订单的时候先进入支付宝Pay控制器接收POST传递的三个参数,订单号,金额,支付方式。接收到之后写商品名称,商品描述,回调地址等 然后实例化Alipay类调用这个类里面的aliPay方法进行支付,调用结果返回一个签名,把这个签名反馈给app端进行支付,支付成功后执行异步回调,修改订单状态,当然还有一些细节操作就不说了,我是已经弄好了,回调这个地方是个坑,大家做的时候一定要仔细认真,耐心才行。现在流程已经走完了,希望能对做这个功能的童鞋有所帮助。
本文属原创内容,为了尊重他人劳动,转载请注明本文地址:


浙公网安备 33010602011771号