小程序接入微信支付的流程
近日开发一个顺风小巴的小程序,开发还是比较简单的,只是有些语法真是反人类,主要难点是微信支付,其他的调调接口渲染一下数据就ok了,下面就详细说一下整个流程及中间遇到的坑。
1、准备工作
a、小程序账号申请
像申请公众号一样,要求企业资质,另外交给企鹅300块钱。
b、微信支付商家平台申请
申请支付功能必不可少的部分,期间踩了一个坑,老板为了节省三百块钱,用一个老的商户平台id绑定到小程序上,结果调试的时候一直报错,提示appid与商家MCHID不匹配,然后小程序无法解绑商户号,只能重新申请小程序和商户号。既耽误了时间又多花了钱。
c、下载商家证书
在商家平台上下载证书,解压放到sdk文件存储证书对应位置
d、服务器https验证
小程序要求服务器必须是https的,并且不是所有https都可以,https://www.qcloud.com/product/ssl 这个地址可以进行测试,测试通过即可使用,否则可能出现真机测试无法获取数据的问题。
e、下载jsapi的SDK
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1 SDK文档下载地址
之后修改SDK的配置文件WxPay.Config.php
const APPID = 'wx97fs3234d88desb'; const APPSECRET = 'ef103ba456be043244238f7b721e957'; const MCHID = '1444333112'; const KEY = 'Niskh5WfdsdfsdWYkr8lrddwsHyE78m2sE';
2、开发
a、微信登录
通过code到服务器获取用户openid,然后存储到小程序本地,用以后续与服务器交互
wx.login({ success: function (res1) { var code = res1.code; wx.request({ url: 'https://服务器/example/login.php', method:'GET', data: { code: code }, success: function (res) { var uid = res.data; console.log(uid) wx.setStorage({ key: "uid", data: uid }) console.log('同步保存成功') } }), wx.getUserInfo({ success: function (res) { console.log(res.data) that.globalData.userInfo = res.userInfo typeof cb == "function" && cb(that.globalData.userInfo) } }) } })
b、获取列表
wx.request({ url: 'https://接口地址', method: 'GET', success: function (res) { var noStartList = res.data.noStartList; that.setData({ noStartList: noStartList, hiddenLoading: !that.data.hiddenLoading }); } })
c、微信支付
小程序端先调用服务器,让服务器创建订单,然后服务器去请求微信支付服务后台生成预支付交易单,返回正确的预支付交易后由小程序端调起支付。
wx.request({ url: 'https://调用服务器获取微信统一下单数据', method: 'GET', data: { uid: uid, id: id }, success: function (res) { var nowTime = new Date() var appId = res.data.appid var timeStamp1 = Math.round((nowTime.getTime()) / 1000) var timeStamp = timeStamp1.toString() var nonceStr = res.data.nonce_str var package = "prepay_id=" + res.data.prepay_id var signType = "MD5" var key = "Niskh5234234WYk4323HyE78m2sE"//商户平台的key var sign = res.data.sign var paySign = md5.hexMD5("appId=" + appId + "&nonceStr=" + nonceStr + "&package=" + package + "&signType=MD5&timeStamp=" + timeStamp + "&key=" + key) wx.requestPayment({ timeStamp: timeStamp, //随机字符串,长度为32个字符以下。 nonceStr: nonceStr, //统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=* package: package, //签名算法,暂支持 MD5 signType: 'MD5', paySign: paySign, success: function (res) { }, fail: function (res) { }, complete: function (res) { } }) } })
服务器端逻辑
//①、获取传递参数 //②、生成订单 //3、统一向微信端下单 $input = new WxPayUnifiedOrder(); $input->SetBody("顺风小巴购票"); $input->SetAttach("顺风小巴购票"); $input->SetOut_trade_no($data['oId']); $input->SetTotal_fee($data['price']*100); $input->SetTime_start(date("YmdHis")); $input->SetTime_expire(date("YmdHis", time() + 600)); $input->SetNotify_url("http://服务器/notify.php"); $input->SetTrade_type("JSAPI"); $input->SetOpenid($openId); $order = WxPayApi::unifiedOrder($input); header("Content-Type: application/json"); echo json_encode($order); exit;
这时候还需要在服务器端完善回调函数notify.php
//重写回调处理函数 public function NotifyProcess($data, &$msg) { Log::DEBUG("call back:" . json_encode($data)); $notfiyOutput = array(); if(!array_key_exists("transaction_id", $data)){ $msg = "输入参数不正确"; return false; } //查询订单,判断订单真实性 if(!$this->Queryorder($data["transaction_id"])){ $msg = "订单查询失败"; return false; } //根据 $data["out_trade_no"] 订单号 更新订单状态 //更新订单状态逻辑代码 return true; }
整个支付过程就完成了,尤其注意的就是支付需要的参数及参数加密顺序,其他的调试一下基本就ok了。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java 老矣,尚能饭否?
摘要: 22 岁,对于一个技术人来说可谓正当壮年。但对于一门编程语言来说,情况可能又有不同。各类编程语言横空出世,纷战不休,然而 TIOBE 的语言排行榜上,Java 却露出了明显的颓势。这个老牌的语言,未来会是怎样? 1写在前面 从 1995 年第一个版本发布到现在,Java 语言已经在跌宕起伏中走过了 22 年,最新的 Java 版本也已经迭代到 Java 9。 22 岁,对于一个技术人来说可谓正当壮年。但对于一门编程语言来说,情况可能又有不同。各类编程语言横空出世,纷战不休,然而 TIOBE 的语言排行榜上,Java 却露出了明显的颓势。这个老牌的语言,未来会是怎样? 1写在前面 从 1995 年第一个版本发布到现在,Java 语言已经在跌宕起伏中走过了 22 年,最新的 Java 版本也已经迭代到 Java 9。当年 Java 语言的跨平台优势如今看来也只不过是家常小菜,Go、Rust 等语言横空出世,进一步拓宽了编程语言的边界。当年发明 Java 语言的 Sun 公司早已被 Oracle 收购,Oracle 现在也正处于水深火热的云计算浪潮当中,甚至连 Java 之父 Jam...
- 下一篇
使用 Python 一步步搭建自己的区块链
你是否会和我一样,对加密数字货币底层的区块链技术非常感兴趣,特别想了解他们的运行机制。 但是学习区块链技术并非一帆风顺,我看多了大量的视频教程还有各种课程,最终的感觉就是真正可用的实战课程太少。 我喜欢在实践中学习,尤其喜欢一代码为基础去了解整个工作机制。如果你我一样喜欢这种学习方式,当你学完本教程时,你将会知道区块链技术是如何工作的。 写在开始之前 记住,区块链是一个 不可变的、有序的 被称为块的记录链。它们可以包含交易、文件或任何您喜欢的数据。但重要的是,他们用哈希 一起被链接在一起。 如果你不熟悉哈希, 这里是一个解释. 该指南的目的是什么? 你可以舒服地阅读和编写基础的Python,因为我们将通过HTTP与区块链进行讨论,所以你也要了解HTTP的工作原理。 我需要准备什么? 确定安装了 Python 3.6+ (还有 pip) ,你还需
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Hadoop3单机部署,实现最简伪集群
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果