整合ThinkPHP功能系列之微信公众号支付

微信公众号支付不同于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 ?

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java思维导图

【 CDN 最佳实践】CDN 命中率优化思路

CDN 在静态资源的加速场景中是将静态资源缓存在距离客户端较近的CDN 节点上,然后客户端访问该资源即可通过较短的链路直接从缓存中获取资源,而避免再通过较长的链...

622
来自专栏Crossin的编程教室

Python爬虫:一些常用的爬虫技巧总结

转自:开源中国 http://my.oschina.net/jhao104/blog/647308 用python也差不多一年多了,python应用最多的场景...

2714
来自专栏北京马哥教育

快学学Python异步IO轻松管理10k+并发连接

异步操作在计算机软硬件体系中是一个普遍概念,根源在于参与协作的各实体处理速度上有明显差异。软件开发中遇到的多数情况是CPU与IO的速度不匹配,所以异步IO存在于...

3036
来自专栏极客慕白的成长之路

HTTP协议原理及实践

HTTP是在应用层,基于传输层 0x1 低三层 物理层主要作用是定义物理设备如何传输数据 数据链路层在通信的实体间建立数据链路连接 网络层为数据在结...

1123
来自专栏码洞

国产巨轮——蚂蚁金服SOFA-RPC框架深度分析

蚂蚁金服近期开源了研发多年的SOFA一篮子框架,其中就有一个非常核心的RPC框架,它叫SOFA-BOLT。小编今天花了近一天的时间仔细阅读研究它的源码,阅读过程...

1282
来自专栏张善友的专栏

ASP.NET2.0应用中定制安全凭证

阅读提要 在缺省状况下,你只能使用Visual Studio 2005的一个本机实例来管理与ASP.NET 2.0一同发行的SQL Server数据库中的安全凭...

1819
来自专栏互联网杂技

为什么要用 Node.js

这是一个移动端工程师涉足前端和后端开发的学习笔记,如有错误或理解不到位的地方,万望指正。 Node.js 是什么 传统意义上的 JavaScript 运行在浏览...

3478
来自专栏晓晨的专栏

ASP.NET Core的身份认证框架IdentityServer4(1)-特性一览

653
来自专栏IT技术精选文摘

Kafka详细设计及其生态系统

Kafka生态-Kafka Core,Kafka Streams,Kafka Connect,Kafka REST Proxy和Schema Registry ...

2277
来自专栏北京马哥教育

Python爬虫:一些常用的爬虫技巧总结

用python也差不多一年多了,python应用最多的场景还是web快速开发、爬虫、自动化运维:写过简单网站、写过自动发帖脚本、写过收发邮件脚本、写过简单验证码...

2777

扫码关注云+社区