이 Alipay 결제를 위해 총 3개의 컨트롤러를 사용했습니다.
1: Alipay 결제 컨트롤러.
2: Alipay 결제 구성 매개변수 컨트롤러.
3: Alipay 콜백 주소 컨트롤러.
먼저 Alipay 결제 컨트롤러를 생성하세요. 이는 이전 페이지에서 결제 수단을 선택하고 결제를 확인한 후 거쳐야 하는 컨트롤러입니다(여기서는 Alipay 결제가 선택됨). 코드는 다음과 같습니다:
<?php namespace app\mobile\controller; use app\mobile\model\Goods; use app\mobile\model\OrderGoods; use think\Controller; class Pay extends Controller { public function pay_order() { $res = new OrderGoods(); //获取订单号 $where['id'] = input('post.order_sn'); $reoderSn = input('post.order_sn'); //查询订单信息 $order_info = $res->where($where)->find(); //获取支付方式 $pay_type = input('post.pay_type');//微信支付 或者支付宝支付 //获取支付金额 $money = input('post.totle_sum'); //判断支付方式 switch ($pay_type) { case 'ali';//如果支付方式为支付宝支付 //更新支付方式为支付宝 $type['pay_type'] = 'ali'; $res->where($where)->update($type); //实例化alipay类 $ali = new Alipay(); //异步回调地址 $url = 'XXXXXXXXXXXXXXXXXX/Callback/aliPayBack'; $array = $ali->alipay('商品名称', $money,$reoderSn, $url); if ($array) { return $array; } else { echo json_encode(array('status' => 0, 'msg' => '对不起请检查相关参数!@')); } break; case 'wx'; break; } } }
그런 다음 Alipay 컨트롤러를 하나 더 만들고 Alipay 구성 매개변수를 작성하면 코드는 다음과 같습니다.
class AliPay extends Controller { protected $appId = '';//支付宝AppId protected $rsaPrivateKey = '';//支付宝私钥 protected $aliPayRsaPublicKey = '';//支付宝公钥 private $seller = ''; /* * 支付宝支付 */ public function aliPay($body, $total_amount, $product_code, $notify_url) { /** * 调用支付宝接口。 */ /*import('.Alipay.aop.AopClient', '', '.php'); import('.Alipay.aop.request.AlipayTradeAppPayRequest', '', '.php');*/ Loader::import('Alipay\aop\AopClient', EXTEND_PATH); Loader::import('Alipay\aop\request\AlipayTradeAppPayRequest', EXTEND_PATH); $aop = new \AopClient(); $aop->gatewayUrl = "https://openapi.alipay.com/gateway.do"; $aop->appId = $this->appId; $aop->rsaPrivateKey = $this->rsaPrivateKey; $aop->format = "json"; $aop->charset = "UTF-8"; $aop->signType = "RSA2"; $aop->alipayrsaPublicKey = $this->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 $response; } function createLinkstring($para) { $arg = ""; while (list ($key, $val) = each($para)) { $arg .= $key . "=" . $val . "&"; } //去掉最后一个&字符 $arg = substr($arg, 0, count($arg) - 2); //如果存在转义字符,那么去掉转义 if (get_magic_quotes_gpc()) { $arg = stripslashes($arg); } return $arg; } function argSort($para) { ksort($para); reset($para); return $para; } }
Alipay 결제 데모를 확장 디렉터리에 넣습니다. 이 방법을 사용하여 Alipay 결제를 구현하면 위 Alipay 구성 매개변수의 내용이 표시됩니다. Alipay Appid를 제외한 컨트롤러, Alipay 공개키, 개인키, 수취인 계좌번호 등을 복사할 수 있게 되었습니다. 이제 두 개의 컨트롤러가 작성되었으며, 비동기 콜백 주소가 있습니다.
<?php namespace app\mobile\controller; use app\mobile\model\OrderGoods; use app\mobile\model\IntegralRecord; use app\admin\model\SystemSettings; use app\mobile\model\Members; use think\Controller; use think\Request; use think\Db; class Callback extends Controller { /* * 支付宝支付回调修改订单状态 */ public function aliPayBack() { if ($_POST['trade_status'] == 'TRADE_SUCCESS') {//如果支付成功 //===============修改订单状态===========================// $order = new OrderGoods();//实例化 $orderSn = $_POST['out_trade_no'];//获取订单号 $where['order_sn'] = $orderSn; $data1['type'] = 2; $order->where($where)->update($data1);//修改订单状态 echo 'success'; exit; } } }
자 이제 코드가 완성되었습니다. Alipay 결제 주문을 실행할 때 먼저 Alipay Pay 컨트롤러에 들어가 POST에서 전달한 세 가지 매개변수, 주문 번호, 금액, 결제 방법을 받습니다. 이를 수신한 후 제품명, 제품 설명, 콜백 주소 등을 작성한 후 Alipay 클래스를 인스턴스화하고 이 클래스의 aliPay 메소드를 호출하여 결제를 수행합니다. 결제 성공 후 비동기 콜백이 실행되어 주문 상태를 수정합니다