微信公众号支付不同于H5支付,博客之前发过关于H5支付的,并且也在Github上开源单文件,前段时间也更新了一部分代码,今天来发一篇Thinkphp框架整合微信公众号支付
微信公众号支付是通过调用微信支付提供的JSAPI接口来调起微信支付模块从而来完成支付,多数情况都是在微信中开发商城所使用,因此页面必须是在微信中打开的,不然是不可能调起来支付的
导入SDK
第一步依旧是导入集成好的SDK,路径是/ThinkPHP/Library/Vendor/Weixin/WeChatPay
配置项
导入以后,主要的还是配置我们微信支付所需要的参数/Application/Common/Conf/config.php
,我的项目中将微信支付参数单独配置,然后在config中使用LOAD_EXT_CONFIG
加载数据配置,因为如果配置多的话看着就有点乱的感觉,比如什么db数据库配置,email发送邮件配置等等
调用
这块因为是调用微信的JSAPI接口来调起支付,所以我使用ajax来请求接口:/Application/Home/Controller/PayController.class.php
public function pay()
{
//部分代码逻辑省略
vendor('Weixin.WeChatPay');
$config = C('WECHAT');
$model = new WeChatPay($config['mchId'],$config['appId'],$config['apiKey']);
$result = $model->createJsBizPackage($user['wx_openid'],$order['money'],$order['order_sn'],'syz',U('pay/notify',[],[],true),time());
$this->ajaxReturn(['code' => 2000,'result' => $result]);
}
调用createJsBizPackage
方法来进行支付的时候,需要传递用户的openid,订单金额,订单号,以及订单名称,回调地址,以及时间戳,这样上面的参数明白了吧?不懂的自己看一下SDK,把上面的参数补齐
既然是js调用当然也需要html页面的支持:/Application/Home/View/Pay/index.html
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>微信支付</title>
</head>
<body style="text-align: center;">
<button onclick="callpay()">购买</button>
<jquery />
</body>
</html>
<script type="text/javascript">
//调用微信JS api 支付
function jsApiCall(json)
{
WeixinJSBridge.invoke(
'getBrandWCPayRequest',
json,
function(res){
WeixinJSBridge.log(res.err_msg);
if(res.err_msg == "get_brand_wcpay_request:ok"){
// 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
alert(res.err_code+res.err_desc+res.err_msg);
}else{
//显示错误信息
alert(res.err_code+res.err_desc+res.err_msg);
}
}
);
}
function callpay()
{
$.ajax({
url:"{:U('pay/pay')}?id={$order_id}", // 这里我是通过id去查订单号的
type:"GET",
success:function(res){
if (typeof WeixinJSBridge == "undefined"){
if( document.addEventListener ){
document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
}else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', jsApiCall);
document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
}
}else{
jsApiCall(res.result);
}
}
})
}
</script>
如果出现签名错误,可以使用官方的微信公众平台支付接口调试工具,校验一下自己的签名是否正确
异步回调
微信支付回调是异步的:/Application/Home/Controller/PayController.class.php
,通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒,异步直接处理业务逻辑就可以
/**
* 微信支付回调
*/
public function notify()
{
$postStr = file_get_contents("php://input");
$post = json_decode(json_encode(simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
if($post['result_code'] == 'SUCCESS' && $post['return_code'] == 'SUCCESS') {
// 支付成功扭转订单状态
$order_sn = $post['out_trade_no'];
//$order_sn = 'SY201805121145102321380644';
//完成你的业务逻辑 修改状态之类的
//给微信返回 防止重复通知
return '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
}else{
return ['msg' => '支付失败'];
}
}
然后就完了 😳 代码会上传到Github,如果项目对你有所帮助,请给一个 star ?
前辈,我加您微信了,看到后通过一下,微信支付困扰了好多天,望能够得到您的帮助,不会让您白忙活的 🙂 ,
博主,这个能用吗
@曾贤惠哈哈哈 嗯
@沈唁 哈哈哈,好的谢谢博主大神
@沈唁 大神,方便加下您的微信或者qq吗
@曾贤惠哈哈哈 85464277 同号
这是tp3.2的吗?
@素材火 嗯 tp3
3.x版本看着就难受 😥
每次看到这些高深的内容,好像每次都只能灌灌水感觉跑路