-
首先我们要梳理清楚,微信到底有哪些平台,以及每个平台的作用。
-
微信开放平台(如果单单只做小程序的话,这个平台可以不管,我们公司因为还有App所以也开通了,并且可以在开放平台绑定小程序【目前来看绑定没什么用处】为第三方移动程序提供接口用的,企业需支付300认证费用)
-
微信公众平台(申请、管理、发布公众号、小程序的平台,企业注册的时候可以使用对公账号打款认证方式,后续可以在微信开放平台绑定当前注册的小程序或微信公众号的公众平台账号)【特别注意:微信小程序如果需要开通微信支付的话,需要在公众平台微信小程序的管理界面中找到微信支付,然后去关联微信商户平台,但是前提是小程序必须通过微信认证,对,又是要交钱,300!!!但是如果你们公司已经有公众号的话(并且已经微信认证过),可以登录公众号的管理后台,绑定小程序,并复用认证资质,直接可以让小程序认证掉,节省300。小程序可以复用公众号的资质,但是公众号是无法复用小程序的资质的,所以建议还是用公众号去做微信认证,这样的话,就两个都能用,没有公众号的,可以再去注册一个!微信最坑的就是需要好多邮箱!!】
-
微信商户平台(企业开通微信支付,需要申请注册商户。申请成功后,可在小程序管理界面申请开通微信支付能力(即绑定当前的微信商户平台账号))
-
微信对话平台(注册申请机器人用的)
-
大体的流程
一、【微信公众平台】申请小程序账号
二、【微信商户平台】注册申请商家账户
三、【微信开发工具】中上传源码并配置服务器相关信息(请求必须都是https(阿里云可以免费申请SLL证书))
四、【微信公众平台】的小程序管理界面开通微信支付(关联商户平台)
五、【微信公众平台】小程序管理界面申请发布小程序
六、【微信商户平台】开通微信分账功能,每一笔交易都实时分账
-
代码中小程序唤起支付
1、小程序端唤起支付还是比较简答的,【登录(获取openId)=>向后台请求支付参数(请求携带支付金额和openId,其余的参数可以在后台写死)=>获取到后台返回的支付参数后,执行支付请求】我这边使用uni-app写的小程序,所有这边贴一下uni-app内部唤起小程序的代码。(整个支付流程看以下这个地址就特别清楚了:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_10&index=1#)
uni.login({provider:getApp().globalData.mLoginProvider,timeout:1500,success(loginRes) {//每一个微信唯一的ID,即openIDlet openId = loginRes.code;console.log("登录成功" + openId);/* 登录成功*//* 微信订单数据请求 */uni.request({rl: 'http://192.168.0.12:28203/api/aquaCyber/login',//请求地址//请求模式method: 'POST',//请求携带的参数data: {customerId:"1223344",payment:"100", // #ifdef MP-WEIXINpayMethod:2,openId:openId,tradeType:"JSAPI",// #endif},timeout:10000,//请求头header: {'Content-Type':'application/json'},//请求成功success:(res) => {console.log(res);let configdata = res.data.data;/* 请求支付参数成功,将参数获取出来,执行支付请求 */uni.requestPayment({provider: getApp().globalData.mPayProvider,// #ifdef MP-WEIXINappId:configdata.appId,//小程序IDtimeStamp: configdata.timeStamp,//时间戳nonceStr: configdata.nonceStr,//随机数package: configdata.packageValue,//数据包signType: configdata.signType,//签名方式paySign: configdata.paySign,//签名数据// #endif// #ifdef MP-ALIPAYorderInfo:configdata.orderInfo,// #endif/* 支付成功,跳转到支付成功的界面 */success:(res) => {/* 弹出成功提示 */uni.showToast({duration:3000,title:"支付成功",icon:'success'});},/* 支付失败 */fail:(error) => {uni.showToast({duration:3000,title:"支付失败",icon:'none'});},complete: () => {uni.hideLoading();}});},/* 请求订单支付参数失败 */fail:(error) => {console.log(error.errMsg);/* 执行请求失败 */uni.showToast({duration:3000,title:"获取支付订单参数失败",icon:'none'});},complete: () => {uni.hideLoading();}})/* 支付宝订单数据请求 */},fail:(error) => {uni.showToast({duration:3000,title:"登录失败",icon:'none'});},complete: () => {uni.hideLoading();}});}
-
特别注意的坑(主要是后台这边)
1、提示【签名失败】,多半是后台返回回来的签名有问题,后台需要在微信返回的签名上做二次签名,特别需要注意的坑是,做二次签名的时候,传参的顺序和传参的大小写(appid是统一下单时候的参数名,appId是二次签名的参数名)。(附加微信在线校验签名地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=20_1)(若这边校验签名是成功,那多半就是二次其签名时候大小写之类的错误)
2、时间戳timeStamp这个参数最好也是后台生成,传给前端。(注意:微信的需要的时间戳是10位的)
3、小程序绑定商户平台的时候,在商户平台上获取到的key之类的参数,以及加密方式必须要做到一致。
4、支付宝小程序,需要在管理平台添加能力,下图三个必要的。
5、小程序唤起支付宝支付整体来说比较简单,这边顺带提一下小程序唤醒支付宝支付的坑,支付宝小程序支付和App的支付是有区别的(buyer_id),小程序支付的时候,前端是需要将授权码交由后台,后台根据授权码获取buyer_id,然后加上buyer_id参数去执行统一下单获取到支付宝交易号,返回给前端,前端即可执行唤起操作。(说是坑的原因的是,之前一直用的统一下单接口,但是小程序区别于App的)(附时序图)【前期由于没有好好看文档,没有加buyer_id,浪费很多时间】
APP和小程序支付方面还有什么问题,欢迎留言。。。