这是我博客关于微信小程序PHP后台的实现的第三篇,前两篇主要介绍了服务器的搭建过程及前台与服务器交互的方式,其实也就是通过get或者post方法传递文字数据,通过$_FILE[]来接收小程序传来的文件,一般都是图片,这一篇,主要进阶来讲讲微信支付功能的实现,因为官方api给的资料太少,要实现起来还是得靠自己慢慢摸索,这样很费时间,因此我在这里将自己的方法记录下来,希望能帮助大家。
1.前期准备
首先要对小程序支付功能开发有个大致了解,具体信息可以见以下链接,这里是支付的框架性东西:
https://pay./wiki/doc/api/wxa/wxa_api.php?chapter=7_10&index=1
当时我们团队为了支付功能借助了有公司资质的其他团队,因为当时需要营业执照,紧接着,要在微信公众号平台开通微信支付功能,记得是要300rmb开通,要绑定商户号,会与收费的银行卡有关系,因为我当时不是负责这块的,这里不是特别清楚,但是按照提示一步一步来,肯定没问题。
在开通完以后,接下来就是具体的开发流程了!
2.微信支付的实现
在讲微信支付的实现时我会结合官方的图来讲!先看支付流程图!!
我们看第一步,首先是要获取openid,什么是openid?就相当于每个微信号对你这个公众号的身份证!!是唯一的,每个微信号对于不同的公众号openid也是不一样的,因此可以用通俗的身份证比喻来理解。获取openid的步骤如下图:
首先前台微信调用wx.login来获取code,接下来用post方法向后台传递该code,后台在接收到code以后,与微信小程序appid和微信小程序密钥一起发送给微信接口,微信的小程序appid与密钥都在微信公众号平台中设置,具体代码如下:
大家一定记得替换图中红色部分的appid与密钥,这样子就获取了openid,接下来要调用微信统一下单api,这是最复杂的一步,好多人看到官方这里的介绍也就头晕了,首先官方地址如下:
https://pay./wiki/doc/api/wxa/wxa_api.php?chapter=9_1&index=1
一步一步来,首先是官方第一请求参数表,此表太长,这里不展示,展示需要注意的是找出必填字段为是的参数,这些参数都是必须的需要的!!!必须需要的!!必须需要的!!!重要的事说三遍!!!大部分数据都可以由前台传过来比如金额(单位是分)等,还有一些是后台已知,比如微信appid与商户号,还有一些是需要后台程序自己生成的比如订单号,这个订单号是32位的字母加数字组合,推荐当前时间值加随机字符串构成,订单号要对自己的小程序来说是唯一的,因此时间粒度尽量取得细一些,获得了这些信息后我们进行下一步,获取sign值!!!这一步很复杂!!!
获取sign值是为了获取pre_payid, pre_payid获取后会再次加一些信息生成新签名,这步待会再说,先来看怎么获取pre_payid!!!
首先获取sign值,我先贴出官方文档,再贴出自己的实现代码,方便大家理解。
官方文档:
我的代码实现过程:
首先定义一个数组$post,这个数组的作用是为了像官方文档里说的字典序排序,因为需要自己写一个排序函数,待会我也会贴出来,然后将必要的数据以key-value的形式放进post数组,右边的变量值已通过$_POST[]从前台获得,这里我没贴出获得过程,此外有个回调地址,这里我随便写了一个地址,即我的服务器php开发路径下的某个php文件,文件可以为空,因为不是很重要,还有个nonce_str,这个是随机32位字符串,这个生成方式是我自己写了一个简单的随机生成方法,总之就是32个字母加数字,接下来最关键的一步,使用自己写的MakeSign函数生成签名!这一函数实现的就是官方文档的签名生成方式!我的代码如下:
其中的ToUrlParams函数如下:
这样子我们就得到了签名sign,接下来要对包括sign值在内的众多参数值包装成xml格式数据,再调用统一支付调用接口api,先贴出打包成xml数据的代码:
在上面这个图中先是打包数据,然后定义微信统一支付的地址,再调用一个自写的http_request函数,将打包好的数据发往url定义的地址,自写的http_request函数如下:
注意,在进行完http_request后,函数会返回一个xml格式的数据,在上面的代码里我是用$xml接收的,接下来需要将接收到的xml格式数据转换为数组,我用了一个xml2array函数进行转换,代码如下
此时我已将微信接口返回来的xml数据转换为数组并存到了$array中,接下来进行再次的签名(这次要带上array中pre_payid),代码如下:
到最后步的echo,算是将支付结果返回给前台了,如果支付成功,就会出现支付成功的页面,失败的话也会显示因为什么失败,到此,支付的过程算是结束了,可能大家觉得结束的有点快,可是事实就是这样,就是中途签名次数有些多,弄得人头晕,我也是探索了好久,最终才成功的,希望大家开发顺利!
码字码了好久,大家如果感觉有帮助,点个赞再走呗~