够意思博客够意思博客够意思博客

TP5.0接入支付宝APP支付

  1. 下载支付宝APP支付官方SDK,并放至Extend中。(下载地址:https://docs.open.alipay.com/54/106370/)

TP5.0接入支付宝APP支付(图1)

2.配置文件config.php添加APP支付资料

//支付宝APP支付资料
'alipay'=>[
   'appId'             => '应用APPID',
   'gatewayUrl'        => 'https://openapi.alipay.com/gateway.do',
   'rsaPrivateKey'     => '',//应用私钥
   'rsaPublicKey'      => '', //应用公钥
   'alipayrsaPublicKey'=> '',//支付宝公钥
   'seller'            => '',//可不要
   'format'            => 'json',
   'charset'           => 'UTF-8',//UTF-8
   'signType'          => 'RSA2',
   'transport'         => 'http',
],

3.生成APP唤起支付的订单信息,返回的$response就是APP唤起支付需要的信息

注意:APP端不需要再转义$response

/**
* 支付宝APP支付  生成订单
* $body            名称
* $total_amount    价格
* $product_code    订单号
* $notify_url      异步回调地址
**/
public function aliPay($body, $total_amount, $product_code, $notify_url)
{
   /**
    * 调用支付宝接口。
    */
   import('.Alipay.AopClient', '', '.php');
   import('.Alipay.request.AlipayTradeAppPayRequest', '', '.php');
   $aop = new \AopClient();
   $aop->gatewayUrl            = Config::get('alipay')['gatewayUrl'];
   $aop->appId                 = Config::get('alipay')['appId'];
   $aop->rsaPrivateKey         = Config::get('alipay')['rsaPrivateKey'];
   $aop->format                = Config::get('alipay')['format'];
   $aop->charset               = Config::get('alipay')['charset'];
   $aop->signType              = Config::get('alipay')['signType'];
   $aop->alipayrsaPublicKey    = Config::get('alipay')['alipayrsaPublicKey'];
   $request = new \AlipayTradeAppPayRequest();
   $arr['body']                = $body;
   $arr['subject']             = $body;
   $arr['out_trade_no']        = $product_code;
   $arr['timeout_express']     = '30m';
   $arr['total_amount']        = floatval($total_amount);
   $arr['product_code']        = 'QUICK_MSECURITY_PAY';
   $json = json_encode($arr);
   $request->setNotifyUrl($notify_url);
   $request->setBizContent($json);
   $response = $aop->sdkExecute($request);
   return htmlspecialchars($response);//就是orderString 可以直接给客户端请求,无需再做处理。
}

4.支付成功回调

/**
* 支付宝支付回调修改订单状态
**/
public function alipay_notify()
{
   //记录支付信息
   file_put_contents("./runtime/alipay.log", json_encode(\request()->param()).PHP_EOL, FILE_APPEND);
   $res = \request()->param();
   //原始订单号
   $out_trade_no = $res['out_trade_no'];
   //支付宝交易号
   $trade_no = $res['trade_no'];
   //交易状态
   $trade_status = $res['trade_status'];
   if ($trade_status == 'TRADE_FINISHED' || $trade_status == 'TRADE_SUCCESS') {
       $save['order_no'] = $out_trade_no; //原订单号
       $save['out_trade_no'] =$trade_no; //支付宝订单号
       $save['is_pay'] = 1;
       $save['pay_way'] = 3;
       $save['pay_time'] = time();
       if(Db::name('order')->where(['order_no'=>['eq',$out_trade_no]])->update($save)){
           return "success";//订单更新成功
       }else{
           return "fail";//订单更新失败
       }
   }else{
       return "fail";
   }
}

5.已支付订单退款

注意:退款API返回10000说明请求成功,并不代表退款成功。需要通过同步返回的fund_change字段来判断是否退款成功,Y代表退款成功,N代表退款失败

/**
* 统一收单交易退款接口  退款用支付宝公钥
* @param $order  订单信息
* @return bool
*/
public function t
kAliPay($order,$tk_money=0.01,$tk_desc='订单取消')
{
   import('.Alipay.AopClient', '', '.php');
   import('.Alipay.request.AlipayTradeRefundRequest', '', '.php');
   $aop = new \AopClient ();
   $aop->gatewayUrl            = Config::get('alipay')['gatewayUrl'];
   $aop->appId                 = Config::get('alipay')['appId'];
   $aop->rsaPrivateKey         = Config::get('alipay')['rsaPrivateKey'];
   $aop->format                = Config::get('alipay')['format'];
   $aop->charset               = Config::get('alipay')['charset'];
   $aop->signType              = Config::get('alipay')['signType'];
   $aop->alipayrsaPublicKey    = Config::get('alipay')['alipayrsaPublicKey'];
   $aop->apiVersion = '1.0';
   $aop->postCharset='UTF-8';

   $request = new \AlipayTradeRefundRequest();
   $arr['trade_no']                = $order['out_trade_no'];
   $arr['out_trade_no']             = $order['order_no'];
   $arr['out_request_no']        = $order['order_no'];
   $arr['refund_amount']     = floatval(0.01);// 上线时改成$tk_money
   $arr['refund_reason ']     = $tk_desc;
   $request->setBizContent(json_encode($arr));
   $result = $aop->execute($request);
   $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
   $resultCode = $result->$responseNode->code;
     //检测是否退款成功,fund_change:Y代表退款成功,N代表退款失败
   if(!empty($resultCode)&&$resultCode == 10000&&$result->$responseNode->fund_change=="Y"){
       return true;
   } else {
       return false;//退款失败
   }
}

总结:跟着支付宝官方DEMO走,一般出现问题都是参数配置错误,遇到无法解决的问题可以咨询官方人工技术客服。

本文为够意思原创文章,转载无需和我联系,但请注明来自够意思博客blog.go1s.cn:够意思博客 » TP5.0接入支付宝APP支付

加载中~