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

2024-06-07 17:18

本文主要是介绍APP(UniAPP) 支付宝支付操作指导 + 遇到的坑(PHP实现),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

  • 近期进行 Uniapp 的开发学习,最后阶段用到了 支付宝支付,相对移动应用的开发周期和专业复杂度,个人觉得这个前端框架还是很有可取之处的
  • 本人在此记录一下,初涉此框架遇到的极有可能入坑的地方,希望道友们引以为鉴 …

指导文档 UniAPP 平台支付流程指导 —— 支付宝 APP支付指导 [文档]

开发框架 :	 	ThinkPHP5.1.2
前端编辑器:		HBuilderX
测试手机 :		魅族、iphone7
支付场景:		APP-支付宝支付
整理时间:		2019-06-18

☛ 前端代码

  • 首先 Uniapp 提供的官方 Demo 已经比较全面了,而服务端是需要我们自行编写的,除了前端样式的变动,我用的都是 Demo 中给的代码,针对于支付宝支付的使用,截取核心代码如下:
	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-PLUSappid = plus.runtime.appid;// #endiflet 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目录,同时注意类的正确引用
  • 核心处理代码如下:
    /*** 支付宝 支付订单号* @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;}

建议对比官方文档指导 —— API / 支付API / app支付接口2.0 的PHP代码示例,你可以发现写法的不同

  • 注意注意!!! 我就是卡在这里一两天,网上找了N篇文章才解决,强烈差评
		//TODO 回调地址的设置,官方文档个人认为有误$request->setNotifyUrl($this->ali_notify_url);//注意使用的是 sdkExecute(),认为文档有坑$result = $aop->sdkExecute($request);
  • 再者,对 payment(Request $request) 的处理,要求使用 echo $message,进行数据的输出,不然无法唤醒支付宝

☛ 支付回调处理

  • 单纯的前端支付完成,直接进行后续逻辑的更新操作是不符合规范的,个人建议后续的处理要在回调地址内进行编写

    核心代码参考:

    /*** 此处进行处理 支付回调操作 ,更新数据库* @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格式 如下:
{"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"}

☞☞☞ >>> 源码下载>>>

☛ 附录

  1. PHP 支付宝退款操作+注意事项

这篇关于APP(UniAPP) 支付宝支付操作指导 + 遇到的坑(PHP实现)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1039800

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

RedHat运维-Linux文本操作基础-AWK进阶

你不用整理,跟着敲一遍,有个印象,然后把它保存到本地,以后要用再去看,如果有了新东西,你自个再添加。这是我参考牛客上的shell编程专项题,只不过换成了问答的方式而已。不用背,就算是我自己亲自敲,我现在好多也记不住。 1. 输出nowcoder.txt文件第5行的内容 2. 输出nowcoder.txt文件第6行的内容 3. 输出nowcoder.txt文件第7行的内容 4. 输出nowcode

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

通过SSH隧道实现通过远程服务器上外网

搭建隧道 autossh -M 0 -f -D 1080 -C -N user1@remotehost##验证隧道是否生效,查看1080端口是否启动netstat -tuln | grep 1080## 测试ssh 隧道是否生效curl -x socks5h://127.0.0.1:1080 -I http://www.github.com 将autossh 设置为服务,隧道开机启动

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主

android一键分享功能部分实现

为什么叫做部分实现呢,其实是我只实现一部分的分享。如新浪微博,那还有没去实现的是微信分享。还有一部分奇怪的问题:我QQ分享跟QQ空间的分享功能,我都没配置key那些都是原本集成就有的key也可以实现分享,谁清楚的麻烦详解下。 实现分享功能我们可以去www.mob.com这个网站集成。免费的,而且还有短信验证功能。等这分享研究完后就研究下短信验证功能。 开始实现步骤(新浪分享,以下是本人自己实现

基于Springboot + vue 的抗疫物质管理系统的设计与实现

目录 📚 前言 📑摘要 📑系统流程 📚 系统架构设计 📚 数据库设计 📚 系统功能的具体实现    💬 系统登录注册 系统登录 登录界面   用户添加  💬 抗疫列表展示模块     区域信息管理 添加物资详情 抗疫物资列表展示 抗疫物资申请 抗疫物资审核 ✒️ 源码实现 💖 源码获取 😁 联系方式 📚 前言 📑博客主页:

探索蓝牙协议的奥秘:用ESP32实现高质量蓝牙音频传输

蓝牙(Bluetooth)是一种短距离无线通信技术,广泛应用于各种电子设备之间的数据传输。自1994年由爱立信公司首次提出以来,蓝牙技术已经经历了多个版本的更新和改进。本文将详细介绍蓝牙协议,并通过一个具体的项目——使用ESP32实现蓝牙音频传输,来展示蓝牙协议的实际应用及其优点。 蓝牙协议概述 蓝牙协议栈 蓝牙协议栈是蓝牙技术的核心,定义了蓝牙设备之间如何进行通信。蓝牙协议

Python应用开发——30天学习Streamlit Python包进行APP的构建(9)

st.area_chart 显示区域图。 这是围绕 st.altair_chart 的语法糖。主要区别在于该命令使用数据自身的列和指数来计算图表的 Altair 规格。因此,在许多 "只需绘制此图 "的情况下,该命令更易于使用,但可定制性较差。 如果 st.area_chart 无法正确猜测数据规格,请尝试使用 st.altair_chart 指定所需的图表。 Function signa