微信小程序支付功能后台PHP实现 - Go语言中文社区

微信小程序支付功能后台PHP实现


这是我博客关于微信小程序PHP后台的实现的第三篇,前两篇主要介绍了服务器的搭建过程及前台与服务器交互的方式,其实也就是通过get或者post方法传递文字数据,通过$_FILE[]来接收小程序传来的文件,一般都是图片,这一篇,主要进阶来讲讲微信支付功能的实现,因为官方api给的资料太少,要实现起来还是得靠自己慢慢摸索,这样很费时间,因此我在这里将自己的方法记录下来,希望能帮助大家。

1.前期准备

首先要对小程序支付功能开发有个大致了解,具体信息可以见以下链接,这里是支付的框架性东西:

https://pay.weixin.qq.com/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.weixin.qq.com/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,算是将支付结果返回给前台了,如果支付成功,就会出现支付成功的页面,失败的话也会显示因为什么失败,到此,支付的过程算是结束了,可能大家觉得结束的有点快,可是事实就是这样,就是中途签名次数有些多,弄得人头晕,我也是探索了好久,最终才成功的,希望大家开发顺利!

 码字码了好久,大家如果感觉有帮助,点个赞再走呗~

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/longjialin93528/article/details/79747803
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-06-27 23:44:37
  • 阅读 ( 1613 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢