前几天做项目,要求要用到支付宝接口,第一次做,弄了好几天 各种坑啊,简单写一下我做支付宝支付的过程,希望对也是第一次做支付宝支付的童鞋有帮助,
不懂的可以先去支付平台看一下支付宝支付的文档,我是下的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‘ => ‘对不起请检查相关参数[email protected]‘)); 41 } 42 break; 43 case ‘wx‘; 44 45 break; 46 } 47 } 48 }
然后又创建了一个Alipay控制器,写支付宝配置参数,代码如下:
1 <?php 2 namespace app\mobile\controller; 3 use think\Db; 4 use think\Controller; 5 6 class AliPay extends Controller 7 { 8 9 protected $appId = ‘‘;//支付宝AppId 10 protected $rsaPrivateKey = ‘‘;//支付宝私钥 11 protected $aliPayRsaPublicKey = ‘‘;//支付宝公钥(现在用不到) 12 private $seller = ‘‘;//收款人账号 13 14 /* 15 * 支付宝支付 16 */ 17 public function aliPay($body, $total_amount, $product_code, $notify_url) 18 { 19 /** 20 * 调用支付宝接口。 21 */ 22 import(‘.Alipay.aop.AopClient‘, ‘‘, ‘.php‘); 23 import(‘.Alipay.aop.request.AlipayTradeAppPayRequest‘, ‘‘, ‘.php‘); 24 $content = array(); 25 $content[‘body‘] = $body; 26 $content[‘subject‘] = $body;//商品的标题/交易标题/订单标题/订单关键字等 27 $content[‘out_trade_no‘] = $product_code;//商户网站唯一订单号 28 $content[‘timeout_express‘] = ‘1d‘;//该笔订单允许的最晚付款时间 29 $content[‘total_amount‘] = floatval($total_amount);//订单总金额(必须定义成浮点型) 30 $content[‘seller_id‘] = $this->seller;//收款人账号 31 $content[‘product_code‘] = ‘QUICK_MSECURITY_PAY‘;//销售产品码,商家和支付宝签约的产品码,为固定值QUICK_MSECURITY_PAY 32 $content = $this->argSort($content);//(固定值) 33 $content = $this->createLinkstring($content); 34 $aop = new \AopClient(); 35 $aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";//(固定值) 36 $aop->appId = $this->appId; 37 $aop->rsaPrivateKey = $this->rsaPrivateKey; 38 $aop->format = "json"; 39 $aop->charset = "UTF-8"; 40 $aop->signType = "RSA2"; 41 $aop->alipayrsaPublicKey = ‘‘; 42 $request = new \AlipayTradeAppPayRequest(); 43 $arr[‘body‘] = $body; 44 $arr[‘subject‘] = $body; 45 $arr[‘out_trade_no‘] = $product_code; 46 $arr[‘timeout_express‘] = ‘30m‘; 47 $arr[‘total_amount‘] = floatval($total_amount); 48 $arr[‘product_code‘] = ‘QUICK_MSECURITY_PAY‘; 49 $json = json_encode($arr); 50 $request->setNotifyUrl($notify_url); 51 $request->setBizContent($json); 52 $response = $aop->sdkExecute($request); 53 return $response; 54 } 55 56 /*************************需要使用到的方法*******************************/ 57 /** 58 * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串 59 * @param $para 需要拼接的数组 60 * return 拼接完成以后的字符串 61 */ 62 function createLinkstring($para) 63 { 64 $arg = ""; 65 while (list ($key, $val) = each($para)) { 66 $arg .= $key . "=" . $val . "&"; 67 } 68 //去掉最后一个&字符 69 $arg = substr($arg, 0, count($arg) - 2); 70 71 //如果存在转义字符,那么去掉转义 72 if (get_magic_quotes_gpc()) { 73 $arg = stripslashes($arg); 74 } 75 76 return $arg; 77 } 78 79 /** 80 * 对数组排序 81 * @param $para 排序前的数组 82 * return 排序后的数组 83 */ 84 function argSort($para) 85 { 86 ksort($para); 87 reset($para); 88 return $para; 89 } 90 }
如果用我这种方法来实现支付宝支付的话,上面的那个支付宝配置参数控制器的内容除了支付宝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端进行支付,支付成功后执行异步回调,修改订单状态,当然还有一些细节操作就不说了,我是已经弄好了,回调这个地方是个坑,大家做的时候一定要仔细认真,耐心才行。现在流程已经走完了,希望能对做这个功能的童鞋有所帮助。
本文属原创内容,为了尊重他人劳动,转载请注明本文地址:
http://www.cnblogs.com/luokakale/p/7612365.html