前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >APP(UniAPP) 支付宝支付操作指导 + 遇到的坑(PHP实现)

APP(UniAPP) 支付宝支付操作指导 + 遇到的坑(PHP实现)

作者头像
泥豆芽儿 MT
发布2019-06-19 19:03:07
7.5K2
发布2019-06-19 19:03:07
举报

前言

  • 近期进行 Uniapp 的开发学习,最后阶段用到了 支付宝支付,相对移动应用的开发周期和专业复杂度,个人觉得这个前端框架还是很有可取之处的
  • 本人在此记录一下,初涉此框架遇到的极有可能入坑的地方,希望道友们引以为鉴
代码语言:javascript
复制
开发框架 :	 	ThinkPHP5.1.2
前端编辑器:		HBuilderX
测试手机 :		魅族、iphone7
支付场景:		APP-支付宝支付
整理时间:		2019-06-18

☛ 前端代码

  • 首先 Uniapp 提供的官方 Demo 已经比较全面了,而服务端是需要我们自行编写的,除了前端样式的变动,我用的都是 Demo 中给的代码,针对于支付宝支付的使用,截取核心代码如下:
代码语言:javascript
复制
	async requestPayment(pay_sn,pay_type,actual_payment,discount_payment) {
				var _this = this;
				let orderInfo = await this.getOrderPayInfo(pay_sn,pay_type);
				//console.log("得到订单信息:"+JSON.stringify(orderInfo));
				if(orderInfo.data.status == 0){
					uni.showModal({
						content: orderInfo.data.message,
						showCancel: false
					})
					return;
				}
				
				if (orderInfo.statusCode !== 200) {
					uni.showModal({
						content: "获得订单信息失败",
						showCancel: false
					})
					return;
				}
				uni.requestPayment({
					provider: pay_type,
					orderInfo: orderInfo.data,
					success: (e) => {
						uni.showToast({
							title: "支付成功"
						})
					},
					fail: (e) => {
						uni.showModal({
							//content: "支付失败,原因为: " + e.errMsg,
							content: "抱歉,您的支付不成功",
							showCancel: false
						})
					},
					complete: () => {
					}
				})
			},
			getOrderPayInfo(pay_sn,pay_type) {
				let appid = "";
				// #ifdef APP-PLUS
				appid = plus.runtime.appid;
				// #endif
				let url = GLOBAL.DOMAIN_URL+"/api/pay/payment?pay_sn="+pay_sn+"&pay_type="+pay_type;
				return new Promise((res) => {
					uni.request({
						url: url,
						success: (result) => {
							res(result);
						},
						fail: (e) => {
							res(e);
						}
					})
				})
			}	

注意: 方法 getOrderPayInfo() 中的请求 url,此为服务端进行处理的地址 controller\Payment->payment(),重中之重 !

☛ 服务端唤醒支付宝代码

  • 1 首先是支付宝唤醒操作 以我的代码整合为例,SDK 源码存放于 extend目录,同时注意类的正确引用
  • 核心处理代码如下:
代码语言:javascript
复制
    /**
     * 支付宝 支付订单号
     * @param array $waitPayOrderInfo
     * @return string
     */
    public function aliPay($waitPayOrderInfo = [])
    {
        $aop = new AopClient();
        $aop->gatewayUrl = $this->gatewayUrl;
        $aop->appId = $this->appID;
        $aop->rsaPrivateKey = $this->rsaPrivateKey;
        $aop->alipayrsaPublicKey = $this->alipayrsaPublicKey;
        $aop->apiVersion = '1.0';
        $aop->signType = 'RSA2';
        $aop->postCharset = 'utf-8';
        $aop->format = 'json';

        $ali_body = $waitPayOrderInfo['ali_body'];
        $ali_total_amount = $waitPayOrderInfo['pay_amount'];
        $ali_out_trade_no = $waitPayOrderInfo['ali_out_trade_no'];

        $request = new AlipayTradeAppPayRequest();
        $request->setBizContent("{" .
            //TODO 商户网站唯一订单号
            "\"out_trade_no\":\"$ali_out_trade_no\"," .
            "\"total_amount\":\"$ali_total_amount\"," .
            //TODO 对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body
            "\"body\":\"$ali_body\"," .

            //TODO 商品的标题/交易标题/订单标题/订单关键字等
            "\"subject\":\"瑞生活1314\"," .
            "\"product_code\":\"QUICK_MSECURITY_PAY\"," .
            //TODO 该笔订单允许的最晚付款时间,逾期将关闭交易
            "\"timeout_express\":\"90m\"," .
            "  }");
        //TODO 回调地址的设置,官方文档个人认为有误
        $request->setNotifyUrl($this->ali_notify_url);
        $result = $aop->sdkExecute($request);
        $message = $result;
        return $message;
    }
 
  • 注意注意!!! 我就是卡在这里一两天,网上找了N篇文章才解决,强烈差评
代码语言:javascript
复制
		//TODO 回调地址的设置,官方文档个人认为有误
        $request->setNotifyUrl($this->ali_notify_url);
        //注意使用的是 sdkExecute(),认为文档有坑
        $result = $aop->sdkExecute($request);
  • 再者,对 payment(Request $request) 的处理,要求使用 echo $message,进行数据的输出,不然无法唤醒支付宝

☛ 支付回调处理

  • 单纯的前端支付完成,直接进行后续逻辑的更新操作是不符合规范的,个人建议后续的处理要在回调地址内进行编写 核心代码参考:
代码语言:javascript
复制
    /**
     * 此处进行处理 支付回调操作 ,更新数据库
     * @param Request $request
     */
    public function aliNotify(Request $request)
    {
        $out_trade_no = $request->param('out_trade_no', null);
        $trade_no = $request->param('trade_no',null);
        $total_amount = $request->param('total_amount', '0.00');
        $subject = $request->param('subject', 'Null');
        $body = $request->param('body', 'Null');
        $timestamp = $request->param('timestamp',date("Y-m-d H:i:s"));
        $resArr = [
            "out_trade_no" => $out_trade_no,
            "trade_no"  => $trade_no,
            "total_amount" => $total_amount,
            "subject" => $subject,
            "body" => $body,
            "timestamp" => $timestamp];
        $json_str_notify = json_encode($resArr);

        //TODO 此时进行更新操作
        if ($out_trade_no){
            //以“A” 分割是我对订单号的自定义处理
            $order_sn = explode("A",$out_trade_no)[0];
            $orderInfoModel = new XorderInfos();
            //TODO 将前面的 $json_str_notify 写入订单记录,方便后期退款,并进行业务更新操作
            $orderInfoModel->updatePayResultForNotify($order_sn, 1,$json_str_notify);
            //echo file_put_contents("ali_pay.txt", $json_str_notify);
        }
    }
  • 存储的 json格式 如下:
代码语言:javascript
复制
{"out_trade_no":"201906109532174488A531178",
"trade_no":"2019061022001445431043252624",
"total_amount":"1.43",
"subject":"\u745e\u751f\u6d3b1314",
"body":"MEDIHEAL \u53ef\u83b1\u4e1d\u7ecf\u5178\u9488\u5242\u6c34\u5e93 \u8865\u6c34\u4fdd\u6e7f\u9762\u819c + \u97e9\u56fdLets diet\u7761\u8863\u516b\u4ef6\u5957",
"timestamp":"2019-06-10 15:14:36"}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年06月18日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • ☛ 前端代码
  • ☛ 服务端唤醒支付宝代码
  • ☛ 支付回调处理
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档