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

 

一、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下载:

http://download.csdn.net/detail/loneleaf1/9045731

http://www.cnblogs.com/strick/p/4754382.html

 

时间: 2024-10-03 05:20:28

微信公众平台开发(四)——微信支付(转)的相关文章

微信公众平台开发(110) 微信连Wi-Fi

关键字:微信公众平台 微信连Wi-Fi 微信 WiFi 硬件鉴权作者:方倍工作室 原文:http://www.cnblogs.com/txw1958/p/weixin-wifi.html   微信连Wi-Fi是为商家的线下场所提供一套完整和便捷的微信连Wi-Fi的方案.商家接入微信连Wi-Fi后,顾客无需输入繁琐的Wi-Fi密码,通过微信扫二维码等方式即可快速上网.微信连Wi-Fi还帮助商家打造个性化服务,如提供微信顶部常驻入口.商家主页展示.连网后公众号下发消息等.因此,微信连Wi-Fi既可以

php微信公众平台开发之微信群发信息_php实例

1.目的 完成在微信公众号中群发消息.这里只是完成简单的文字发送.也可以发送语音图片等,只是发送数据格式不同而已,下面有链接,可以查询数据类型的数据发送格式. 2.群发短信的流程 获取测试公众账号(有账号的可以不用测试账号,不过正式的账号限制比较多)用户关注上面的公众账号通过appid和appsecret获取我们的access_token通过access_token群发短信 3.获取测试公众账号 + 关注公众号 1).公众测试账号获取 访问上面的连接,选择"接口测试号申请"获得直接打开

微信公众平台开发(112) 微信卡券

关键字:微信公众平台 微信卡券 团购券 代金券 折扣券 礼品券(兑换券) 优惠券 导入code 核查code 修改库存 群发卡券 通过卡券货架投放卡券 创建二维码投放 核销卡券 查询卡券 微信买单 删除卡券 设置卡券失效 拉取卡券概况数据 获取免费券数据  拉取会员卡数据 朋友的券(共享券)  会员卡 会议/演出门票 景区门票 电影票 飞机票作者:方倍工作室 原文:http://www.cnblogs.com/txw1958/p/weixin-card.html   在这篇微信公众平台开发教程中

php微信公众平台开发之微信群发信息

1.目的 完成在微信公众号中群发消息.这里只是完成简单的文字发送.也可以发送语音图片等,只是发送数据格式不同而已,下面有链接,可以查询数据类型的数据发送格式. 2.群发短信的流程 获取测试公众账号(有账号的可以不用测试账号,不过正式的账号限制比较多)用户关注上面的公众账号通过appid和appsecret获取我们的access_token通过access_token群发短信 3.获取测试公众账号 + 关注公众号 1).公众测试账号获取 访问上面的连接,选择"接口测试号申请"获得直接打开

微信公众平台开发(120) 微信支付报关接口

关键字:微信支付 微信支付v3 报关接口 作者:方倍工作室原文: http://www.cnblogs.com/txw1958/p/wxpay-declare.html   本文介绍微信支付下的报关接口的开发过程.微信报关是用于商户提交海关需要的订单信息.   一.报关接口API 接口地址 https://api.mch.weixin.qq.com/cgi-bin/mch/customs/customdeclareorder 是否需要证书 不需要. 请求方式:post 数据格式:xml 签名方式

微信公众平台开发(108) 微信摇一摇

关键词:微信 摇一摇 DeviceOrientation DeviceMotion  本文介绍使用HTML5的DeviceOrientation特性在微信中实现摇一摇的功能. 在HTML5中,DeviceOrientation特性所提供的DeviceMotion事件封装了设备的运动传感器时间,通过改时间可以获取设备的运动状态.加速度等数据(另还有deviceOrientation事件提供了设备角度.朝向等信息).而通过DeviceMotion对设备运动状态的判断,则可以帮助我们在网页上就实现"摇

微信公众平台开发教程

本系列微信公众平台教程以PHP+MySQL为开发环境,介绍了微信公众平台开发模式下基础接口.自定义菜单.高级接口.WeiXin JS接口.微信支付等接口以及在此基础上的功能或应用开发的方法及技巧,案例极具实用价值,是学习微信公众平台开发实战的经典教材.   配套书籍 <微信公众平台开发最佳实践> 由方倍工作室编写,覆盖基础接口.自定义菜单.高级接口.微信支付.转发分享等五大接口,包含近30个案例及技巧,已成功帮助无数人进入微信开发领域. 购买地址        准备工作 微信公众平台的注册 介

基于php的微信公众平台开发入门实例_php实例

本文实例讲述了基于php的微信公众平台开发方法.分享给大家供大家参考.具体如下: 最近在做微信公众平台开发,一口气写了二十几个功能,挺有意思的- 今天来分享一下开发经验~ 微信公众平台提供的接口很简单,先看看消息交互流程: 说的通俗一些,用户使用微信发送消息 -> 微信将数据发送给开发者 -> 开发者处理消息并返回数据至微信 -> 微信把返回数据发送给用户,期间数据交互通过XML完成,就这么简单.   下面写个实例,开发微信智能聊天机器人:  1. 注册微信公众平台账号 微信公众平台:

微信公众平台开发书籍推荐

关键字:微信开发图书 微信公众平台开发书籍 微信图书 微信开发书籍 微信图书推荐 微信开发图书推荐  本文介绍了当前图书市场上最主要的微信公众平台开发类书籍,并对每本书的特色做了简要点评,供有需要购买的读者进行参考. 下列书籍按使用顺序,分为PHP.Java.C#三类.   -------------------以下是使用PHP做微信开发的图书推荐------------------- 微信公众平台开发(又名微信公众平台开发最佳实践第3版) 作      者 方倍工作室 出 版 方 方倍工作室

微信公众平台开发(36)疯狂猜图

微信公众平台开发 微信公众平台开发模式 微信公众平台 企业微信公众平台 微信疯狂猜图作者:方倍工作室 原文: http://www.cnblogs.com/txw1958/archive/2013/06/10/wechat-36-guess-picture-carzy.html 微信疯狂猜图答案 微信怎么玩疯狂猜图 微信疯狂猜图在哪里 微信疯狂猜图二维码 微信上的疯狂猜图 微信疯狂猜图下载 微信游戏 疯狂猜图 微信疯狂猜图攻略 疯狂猜图微信群 疯狂猜图 微博 看图猜词(Icomania)  疯狂