微信小程序支付 - 全流程(不懂请留言)

官方链接: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");

 

至此,成功调用微信统一下单接口并返回数据到小程序。

 

欢迎各位大佬留言讨论、批评指正、技术教导。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值