官方链接:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_10&index=1
注:大概是我实力不足吧,看不懂太高深又化繁为简的教程?反正我觉得这个文档没什么卵用。
进入主题 ↓
一、开通微信支付
1. 进入 “小程序的公众平台”,开通微信支付功能。
1.1 需认证,
如果已有认证了的公众号,可以直接复用公众号认证资质完成小程序的认证。链接:https://jingyan.baidu.com/article/4b07be3c8e3d8548b380f3aa.html 。
如果没有,则进入 “小程序的公众平台” - 设置 - 认证。需要 申请材料和300元。链接:https://jingyan.baidu.com/article/4b07be3c8e3d8548b380f3aa.html 。
1.2 需绑定微信商户号,
链接:http://kf.qq.com/faq/140225MveaUz161230yqiIby.html 。
注:我的是 绑定已有商户号,但与上方微信给的绑定教程不一样:使用超级管理员登录商户平台,进入 “产品中心 - APPID 授权管理 - 新增授权申请单 - 填写小程序的 APPID” ,完成后,可以在 “产品中心 - APPID 授权管理 ” 页面看到已授权的小程序。
1.3 完成以上两个步骤可以在 “小程序的公众平台” - 微信支付 - 商户号管理中,看到 商户号信息 和 MA授权申请信息。
二、代码
2.1 获取 openId
链接:https://developers.weixin.qq.com/miniprogram/dev/api/wx.login.html?search-key=login 。
这个难度不大。
// php 代码
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api.weixin.qq.com/sns/jscode2session?appid=$appId&secret=$appSecret&js_code=$code&grant_type=$authorizationCode");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
$dataResult = curl_exec($ch);
curl_close($ch);
$rez = json_decode($dataResult,true);
//$rez["openid"]
2.2 生成订单号,并保存至数据库,记录订单状态。
随机生成订单号字段,并保存,用于下一步的微信统一下单和商家数据管理。
注:非必须。
2.3 调用微信统一下单接口(重点)
这一步网上找了很多教程,大家写的都不一样,而且也因大家写的时候的需求不一样,所以看那些文章往往耗时良久不知所云。所以还是决定按照官方给的教程来写自己的需求,这样也更通用。(其实真正原因是对于我这菜鸡来说,写不出更高端 bug 少的框架,所以就不舍近求远了)。
微信小程序支付,和微信 H5 页面的 JSAPI 支付区别不大,起码在 “调用微信统一下单接口” 这一部分是一样的。
这里去官方下载 JSAPI 支付的 SDK 和 DEMO,链接:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1 。
我这里下载的是 PHP 的:
lib 文件夹复制到自己目录无需修改,example 中的这5个文件复制到自己目录待修改。
然后,
config 文件中修改自己的配置项:
AppId(小程序 appid),
MerchantId(商户平台商户号),
Key(商户秘钥),
AppSecret(小程序secret),
SSLCertPath(商户 API 证书的路径,在 “商户平台 - 账号中心 - API 安全” 中申请后下载,然后放入自己新建的 cert 目录中,并修改该字段值,字段值为路径,指向该目录的文件),
NotifyUrl(支付后默认通知调用地址,可不修改,在调用统一订单时再写入),
SignType(签名类型,可不修改)。
JsApiPay 中 GetOpenid 函数,修改为获取上一步中获取的 OpenId,
jsapi 去掉头和尾的 html 标签和 js 待使(食)用,注释掉 echo 和 print 无关的代码 和 获取收货地址的代码,然后剩下的就是 php 的调用微信统一下单接口的代码了,
修改订单 order 中商品信息参数:
body 商品信息。
attach 附加信息可用于notify中获取使用。
Out_trade_no 订单号。
Total_fee支付金额,分,整数。
Goods_tag 商品标签。
Notify_url 修改为支付后 notify 通知路径,在 notify 中可写入一些支付后该干的事,比如根据订单号修改数据库中的商品支付状态。否则,无法得知用户是否支付,就只能通过 orderquery 订单查询去得知订单状态了,本文不进行说明订单查询。
图中删去了个人业务需求相关的代码。
2.4 代码修改
修改一:
在 WxPay.JsApiPay.php 中 GetJsApiParameters 函数返回的 $parameters 去掉了 json_encode 函数,改为在统一下单后将此数据放入返回的 data 中再进行 json 编码返回小程序。
修改二:
在测试时,本菜鸟进行统一下单,小程序端一直返回 data="",查看log报错信息,在 WxPay.Api.php 中 81 行,却无错误信息,然后将 catch 中的 json_encode 函数注释掉了,发现是 “ curl出错,错误码:60” 度娘找到这篇文章 https://blog.csdn.net/qq_34755805/article/details/51221932 。
说明:将 catch 中的 json_encode 函数注释掉,因为我对全局错误信息做了自定义处理。set_error_handler("customError");
修改如下:
在去WxPay.Api.php 文件中找到如下代码:
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验
作如下修改
if(stripos($url,"https://")!==FALSE){
curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
} else {
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验
}
修改三:
PHP7 中 $GLOBALS ["HTTP_RAW_POST_DATA"] 不可使用,所以在 lib/WxPayApi.php 的 notify 函数中需要修改如下:
(php5 不需要修改)
// $xml = $GLOBALS['HTTP_RAW_POST_DATA'];
$xml = file_get_contents("php://input");
至此,成功调用微信统一下单接口并返回数据到小程序。
欢迎各位大佬留言讨论、批评指正、技术教导。