ThinkPHP 5如何接入支付宝支付功能

如何实现支付宝支付功能 做电商网站的朋友都知道在线支付功能是必不可少的,作为现在线上支付巨头“支付宝支付”,“微信支付”是一个电商网站的标配。今天我们就来一起学习一下在thinkphp5 中“支付宝即时支付”是如何实现。这里我们以WSTMart开源B2B2C系统为例来分享:在thinkphp5 中如何接入支付宝功能。

  1. 首先你要开通支付宝商户号,
  2. 登录蚂蚁金服开发平台创建应用,并签约电脑网站支付

ThinkPHP 5如何接入支付宝支付功能_第1张图片

ThinkPHP 5如何接入支付宝支付功能_第2张图片

  1. 将商户信息配置到系统中

ThinkPHP 5如何接入支付宝支付功能_第3张图片

以上准备工作做好了,我们来看看代码是如何实现的: 在wstmart\home\controller\Alipays.php 支付宝控制器中,首生会初始化获取到配置信息 /**

  • 初始化 */ private $aliPayConfig; public function _initialize() { $this->aliPayConfig = array(); $m = new M(); $this->aliPayConfig = $m->getPayment("alipays"); }

接下来会通过getAlipaysUrl()方法来是组建调起支付宝所需要的参数,并通过返回一个json数组将数据传到页面,然后跳转url,调起支付宝进行支付 /**

  • 生成支付代码 / function getAlipaysUrl(){ 这里代码省略… if($data["status"]==1){ $return_url = url("home/alipays/response","",true,true); $notify_url = url("home/alipays/aliNotify","",true,true); $parameter = array( 'extra_common_param'=> $extra_common_param,//扩展参数 'service' => 'create_direct_pay_by_user', 'partner' => $this->aliPayConfig['parterID'], '_input_charset' => "utf-8", 'notify_url' => $notify_url, 'return_url' => $return_url, / 业务参数 / 'subject' => $subject, 'body' => $body, 'out_trade_no' => $out_trade_no, 'total_fee' => $orderAmount, 'quantity' => 1, 'payment_type' => 1, / 物流参数 / 'logistics_type' => 'EXPRESS', 'logistics_fee' => 0, 'logistics_payment' => 'BUYER_PAY_AFTER_RECEIVE', / 买卖双方信息 */ 'seller_email' => $this->aliPayConfig['payAccount'] ); ksort($parameter); reset($parameter); $param = ''; $sign = ''; foreach ($parameter AS $key => $val){ $param .= "$key=" .urlencode($val). "&"; $sign .= "$key=$val&"; } $param = substr($param, 0, -1); $sign = substr($sign, 0, -1). $this->aliPayConfig['parterKey']; $url = 'https://mapi.alipay.com/gateway.do?'.$param. '&sign='.md5($sign).'&sign_type=MD5'; $data["url"] = $url; } return $data; }

当用户支付完成后,支付宝会异步调用商户网站回调地址,WSTMart的回调地址是“home/alipays/aliNotify”,在aliNotify中会通过notify方法对支付宝进行签名验证,验证通过后再对订单状态进行改变。【注:回调地址中不能出现“xxx?xx=1”这样的带参url】

/**

  • 支付回调验证接口 */ function notify($request){ $returnRes = array('info'=>'','status'=>false); $request = $this->argSort($request); // 检查数字签名是否正确 $isSign = $this->getSignVeryfy($request); if (!$isSign){//签名验证失败 $returnRes['info'] = '签名验证失败'; return $returnRes; } if ($request['trade_status'] == 'TRADE_SUCCESS' || $request['trade_status'] == 'TRADE_FINISHED'){ $returnRes['status'] = true; } return $returnRes; } 验证成功后就是商户网站对订单逻辑的处理了,这里就不多说了,希望对大家有所帮助!!

转载于:https://my.oschina.net/u/2392706/blog/1575283

你可能感兴趣的:(php,json)