开发者社区> 技术小胖子> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

微信公众平台开发(四)——微信支付

简介:
+关注继续查看

一、JS-SDK

 公众号中的微信支付需要通过JS来实现。微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包。点击查看在线文档

 

1)引入JS脚本文件

<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>

 

2)通过config接口注入权限验证配置

<script>
    wx.config({
    debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
    appId: '', // 必填,公众号的唯一标识
    timestamp: , // 必填,生成签名的时间戳
    nonceStr: '', // 必填,生成签名的随机串
    signature: '',// 必填,签名
});
</script>

appId就是应用ID,wx打头的那串字符,timestamp在php中就用time()获取,而nonceStr就用uniqid()获取,而signature根据特定算法获取。

protected function getJsapiConfig()
    {
        $weixin = new Weixin();
        $ticketMongo = new WeixinJsapiTicket();
        $data = [
            'appId' => $weixin->getAppId(),
            'noncestr' => uniqid(),
            'jsapi_ticket' => $ticketMongo->getJsapiTicket(),
            'timestamp' => time()
        ];
        //拼装原始待签名串
        $src = [
            'noncestr=' . $data['noncestr'],
            'jsapi_ticket=' . $data['jsapi_ticket'],
            'timestamp=' . $data['timestamp']
        ];
        sort($src);
        $data['signature'] = sha1(implode('&', $src));
        return $data;
    }

这里说明下“jsapi_ticket”,jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。由于有时间限制,而且获取jsapi_ticket的api调用次数非常有限,所以我会将获取到的jsapi_ticket保存到MongoDB中。

/**
     * 通过access_token获取jsapi_ticket
     * @param $access_token
     * @return string | null
     */
    public function getJsapiTicket($access_token)
    {
        $url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket';
        $param = [
        'access_token' => $access_token,
        'type' => 'jsapi'
                ];
        $res = $this->request($url, $param);
        $result = json_decode($res, true);
        if (isset($result['errcode']) && $result['errcode'] == 0 && isset($result['ticket'])) {
            return $result;
        }
        return null;
    }

 

3)通过ready接口处理成功验证

1)prepay_id是根据本地生成的订单号等获取的,订单号每次请求的得不一样,不然会报错的,点击查看在线文档

2)nonceStr就用md5(uniqid('baiaimama'))获取

3)signType使用MD5

4)paySign根据代码的参数,排序后拼接获得。

wx.chooseWXPay({
    timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
    nonceStr: '', // 支付签名随机串,不长于 32 位
    package: '', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
    signType: '', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
    paySign: '', // 支付签名
    success: function (res) {
        // 支付成功后的回调函数
    }
});
/**
     * 生成jsapi需要调用的参数
     */
    public function getJsapiParam(){
        $param = [
        'appId' => $this->APPID,
        'timeStamp' => time(),
        'nonceStr' => md5(uniqid('baiaimama')),
        'package' => 'prepay_id='.$this->param['prepay_id'],
        'signType' => 'MD5'
                ];
    
        $str = [];
        foreach($param as $k=>$v){
            if(!empty($v)){
                $str[] = "{$k}={$v}";
            }
        }
        sort($str);
        $unsignKey = join('&', $str).'&key='.$this->KEY;
        $sign = strtoupper(md5($unsignKey));
        $param['paySign'] = $sign;
        return $param;
    }

 

二、异步回调

异步回调中做些修改订单状态、发送短信,推送消息等操作。

/**
     * 微信支付异步回调API
     * 微信支付成功,会收到异步回调
     */
    public function actionWxpay()
    {    
        $weixinPay = new WeixinPay();
        $weixin = new Weixin();
        
        $xml = file_get_contents('php://input');
        $msg = $weixin->parseMsg($xml);
    
        //记录微信推送日志
        $notifyMongo = new WeixinPayNotify();
        $notifyMongo->logPayNotify($xml);

        if(!$msg || !is_object($msg)){
            $weixinPay->notifyXml('FAIL', '通知不合法');
        }
    
        if(!isset($msg->return_code) || $msg->return_code != 'SUCCESS'){
            $weixinPay->notifyXml('FAIL', '通信失败');
        }
    
        if(!isset($msg->result_code) || $msg->result_code != "SUCCESS"){
            $weixinPay->notifyXml('FAIL', '交易失败');
        }
    
        //签名验证失败
        if(!$weixinPay->checkSign($msg)){
            $weixinPay->notifyXml('FAIL', '签名验证失败');
        }
        //$notifyMongo->add($msg);
        //流程走到这里说明已经支付成功了,这里无需更新订单逻辑
        $userOrder = new UserOrder();
        //记录微信订单号
        $userOrder->pay($msg->out_trade_no, $msg->transaction_id);
    }

 

demo下载:

github地址:https://github.com/pwstrick/weixin_demo

CSDN地址:http://download.csdn.net/detail/loneleaf1/9045731

    本文转自 咖啡机(K.F.J)   博客园博客,原文链接:http://www.cnblogs.com/strick/p/4754382.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
微信开发之扫码支付
此项目已开源欢迎Start、PR、发起Issues一起讨论交流共同进步 https://github.
1132 0
微信支付开发教程
本文介绍微信支付v2和v3版的微信支付开发教程,来源于微信公众平台官方网站。 原文:http://www.cnblogs.com/txw1958/p/wxpay-development-document.html   前言 微信支付现在分为v2版和v3版,2014年9月10号之前申请的为v2版,之后申请的为v3版。
1384 0
微信支付开发(5) 订单查询
由于微信支付接口更新,本文档已过期,请查看新版微信支付教程。地址 http://www.cnblogs.com/txw1958/category/624506.html   本文介绍微信支付中订单查询功能的实现。
1471 0
微信公众平台开发教程
本系列微信公众平台教程以PHP+MySQL为开发环境,介绍了微信公众平台开发模式下基础接口、自定义菜单、高级接口、WeiXin JS接口、微信支付等接口以及在此基础上的功能或应用开发的方法及技巧,案例极具实用价值,是学习微信公众平台开发实战的经典教材。
1917 0
【转】微信公众平台开发入门教程
http://www.cnblogs.com/txw1958/p/wechat-tutorial.html 关键字:微信公众平台开发作者:方倍工作室
572 0
公众平台商户接入(微信支付)功能申请教程
  场景及类型介绍 商家可以申请公众账号支付和APP(应用客户端)支付两种接入微信支付方式。 公众账号支付:用户在微信公众帐号内使用微信支付消费,案例:易迅、QQ充值。 APP(应用客户端)支付:用户在手机应用APP内使用微信支付消费,案例:大众点评、易迅。
1697 0
微信支付类目及费率
目前,微信支付采取的是“T+3”到账模式,也就是即时到账模式,非担保交易,买家付款后,资金直接进入卖家财付通账户,3天后可结算、提现。 据悉,微信支付手续费将从每笔交易中抽取,保证金在完成合同签订后由微信通知缴纳。
1185 0
微信公众账号支付商户接入指南
公众号支付商户接入指南----------------------------- 1 公众账号相关事宜说明1.1 申请微信支付的公众账号需符合的条件申请微信支付功能的公众号必须具备 2 个条件� 公众号为服务号� 公众号必须经过微信认证(如何转换服务号和申请微信认证在后面详述)1.2 申请公众账号如果商户还没有公众帐号,请按照以下流程指导申请微信公众账号。
2982 0
微信公众平台开发入门教程(四)获取接收消息
定义消息类型处理函数 在接收到的消息中根据消息类型,定义不同的消息处理函数, public function responseMsg() { $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; if (!empty($postStr))...
844 0
微信公众平台开发入门教程
关键字:微信公众平台开发作者:方倍工作室   在这篇微信公众平台开发教程中,我们假定你已经有了PHP语言程序、MySQL数据库、计算机网络通讯、及HTTP/XML/CSS/JS等基础。 我们将使用微信公众账号方倍工作室作为讲解的例子,二维码见左侧。
1395 0
21114
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载