tp5实现支付宝支付二维码,扫码(当面付)
这里只说扫码支付,使用官方的代码,为什么没使用yansongda之类的组件,因为这个封装的太深了问题不好找,所以使用了官方的代码
支付宝支付文档:https://opendocs.alipay.com/open/270/01didh?pathHash=a6ccbe9a
官方代码仓库:https://github.com/alipay/alipay-sdk-php-all 选v2还是v3看自己的情况
首先要开通当面付~ 自己看文档(产品介绍 - 支付宝文档中心 (alipay.com))
流程:1,调用统一收单线下交易预创建接口,传入订单数据价格,订单号等,生成二维码返回给前端,我这里是用在PC网页上 (统一收单线下交易预创建接口 - 支付宝文档中心 (alipay.com))
2,用户扫码,付款->回调->回调逻辑->入库 (异步通知说明 - 支付宝文档中心 (alipay.com))
使用场景:PC前端调用接口,接到二维码地址,放到canvas展示
<view>
<canvas canvas-id="qrcode" class="cz_wx"></canvas>
</view>
php代码:调用下单接口,返回二维码给前端
/** * 支付宝支付(独立) */ public function alipay($out_trade_no, $total_amount, $subject) { require_once('../extend/alipay/aop/AopClient.php'); require_once('../extend/alipay/aop/request/AlipayTradePrecreateRequest.php'); $aop = new \AopClient(); $aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do'; $aop->appId = '自己的appid'; $aop->rsaPrivateKey = '写自己的应用私钥'; $aop->alipayrsaPublicKey = '写自己的公钥'; $aop->apiVersion = '1.0'; $aop->signType = 'RSA2'; $aop->postCharset = 'UTF-8'; $aop->format = 'json'; $object = new \stdClass(); $object->out_trade_no = $out_trade_no; //订单号 $object->total_amount = $total_amount; //金额 $object->subject = $subject; //商品名称 $json = json_encode($object); $request = new \AlipayTradePrecreateRequest(); $notify = 'http://zsscadmin.vhost.chengzhanheng.cn/api/paynotify/alinotify'; $request->setNotifyUrl($notify); $request->setBizContent($json); $result = $aop->execute($request); $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response"; $resultCode = $result->$responseNode->code; if (!empty($resultCode) && $resultCode == 10000) { return $result->$responseNode->qr_code; // $this->success('生成成功', $result->$responseNode->qr_code); // echo "成功"; } else { echo false; } } }
php代码:回调
/** * 支付宝回调 */ public function alinotify() { require_once('../extend/alipay/config.php'); require_once('../extend/alipay/pagepay/service/AlipayTradeService.php'); $arr = $_POST; $alipaySevice = new \AlipayTradeService($config); $alipaySevice->writeLog(var_export($_POST, true)); $result = $alipaySevice->check($arr); if ($result) { if ($_POST['trade_status'] == 'TRADE_SUCCESS' || $_POST['trade_status'] == 'TRADE_FINISHED') { $payamount = $_POST['total_amount']; //支付金额 $out_trade_no = $_POST['out_trade_no']; //订单号 //找出该订单 $pay_map = []; $pay_map['pay_no'] = ['=', $out_trade_no]; $PayLog = (new RechargeOrder())->where($pay_map)->find(); $userInfo = (new \app\common\model\User())->where('id', '=', $PayLog['userid'])->find(); if (!$userInfo) { echo 'fail'; exit(); } if ($PayLog['is_pay'] == 1 && $PayLog['paytime']) { echo 'fail'; exit(); } //开启事务 $user_model = (new \app\common\model\User()); $log_model = (new RechargeOrder()); $log_model->startTrans(); $user_model->startTrans(); try { //通过账单获取充值记录 $updatedata = [ 'id' => $PayLog['id'], 'payamount' => $payamount, 'is_pay' => 1, 'pay_json' => 'xxxxxx', 'paytime' => time(), 'updatetime' => time(), ]; $pay_log_res = $log_model->isUpdate(true)->save($updatedata); //$pay_log_res = Db::name('recharge_order')->where('id', $PayLog['id'])->update($updatedata); //增加速写豆 $title = '充值速写豆¥' . $payamount; $bili = 10; // 充值比例计算 if (!empty($this->config['pay_ratio'])) { $bili = $this->config['pay_ratio']; } // $money = floatval($PayLog['pay_price'])*$bili; $money = $PayLog['pay_price'] * $bili;$user_model::umoney($money, $userInfo['id'], '充值编号:' . $PayLog['pay_no'], '2', 'alipay', $title, 1); if ($pay_log_res) { $log_model->commit(); //事务提交 $user_model->commit(); //事务提交 } echo 'success'; exit(); // 提交 //你可以在此编写订单逻辑 } catch (Exception $e) { $log_model->rollback(); //事务回滚 $user_model->rollback(); //事务回滚 //回滚 } echo 'success'; } else { echo 'fail'; } } }
回调中容易出现问题,根据自己的业务逻辑写