WeChatパブリックプラットフォームがWeChat決済を開発

高洛峰
リリース: 2017-03-01 09:59:09
オリジナル
1802 人が閲覧しました

1. JS-SDK

公式アカウントでの WeChat 支払いは JS を通じて実装する必要があります。 WeChat JS-SDK は、Web 開発者向けの WeChat パブリック プラットフォームによって提供される WeChat に基づく Web 開発ツールキットです。

1) JS スクリプト ファイルを導入します

<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
ログイン後にコピー

2) 設定インターフェイスを通じて権限検証設定を挿入します

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

appId はアプリケーションID、wx 文字列から始まり、timestampはphpのtime()を使用して取得され、nonceStrはuniqid()を使用して取得され、signatureは特定のアルゴリズムに従って取得されます。

protected function getJsapiConfig()
    {
        $weixin = new Weixin();
        $ticketMongo = new WeixinJsapiTicket();
        $data = [
            &#39;appId&#39; => $weixin->getAppId(),
            &#39;noncestr&#39; => uniqid(),
            &#39;jsapi_ticket&#39; => $ticketMongo->getJsapiTicket(),
            &#39;timestamp&#39; => time()
        ];
        //拼装原始待签名串
        $src = [
            &#39;noncestr=&#39; . $data[&#39;noncestr&#39;],
            &#39;jsapi_ticket=&#39; . $data[&#39;jsapi_ticket&#39;],
            &#39;timestamp=&#39; . $data[&#39;timestamp&#39;]
        ];
        sort($src);
        $data[&#39;signature&#39;] = sha1(implode(&#39;&&#39;, $src));
        return $data;
    }
ログイン後にコピー

「jsapi_ticket」について説明します。 jsapi_ticket は、公式アカウントが WeChat JS インターフェースを呼び出すために使用する一時的なチケットです。通常の状況では、access_token を通じて取得される jsapi_ticket の有効期間は 7200 秒です。時間制限があり、jsapi_ticket を取得するための API 呼び出しの回数は非常に限られているため、取得した jsapi_ticket を MongoDB に保存します。

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

3) 準備完了インターフェースを介して成功した検証を処理します

1) prepay_id は、ローカルに生成された注文番号などに基づいて取得されます。注文番号は要求されるたびに異なり、それ以外の場合はエラーになります報告されます

2) md5(uniqid('baiaimama'))を使用してnonceStrを取得します

3) MD5をsignTypeに使用します

4) paySignは、コードのパラメータに従ってソートおよび連結することによって取得されます。

wx.chooseWXPay({
    timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
    nonceStr: &#39;&#39;, // 支付签名随机串,不长于 32 位
    package: &#39;&#39;, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
    signType: &#39;&#39;, // 签名方式,默认为&#39;SHA1&#39;,使用新版支付需传入&#39;MD5&#39;
    paySign: &#39;&#39;, // 支付签名
    success: function (res) {
        // 支付成功后的回调函数
    }
});
ログイン後にコピー

/**
     * 生成jsapi需要调用的参数
     */
    public function getJsapiParam(){
        $param = [
        &#39;appId&#39; => $this->APPID,
        &#39;timeStamp&#39; => time(),
        &#39;nonceStr&#39; => md5(uniqid(&#39;baiaimama&#39;)),
        &#39;package&#39; => &#39;prepay_id=&#39;.$this->param[&#39;prepay_id&#39;],
        &#39;signType&#39; => &#39;MD5&#39;
                ];
    
        $str = [];
        foreach($param as $k=>$v){
            if(!empty($v)){
                $str[] = "{$k}={$v}";
            }
        }
        sort($str);
        $unsignKey = join(&#39;&&#39;, $str).&#39;&key=&#39;.$this->KEY;
        $sign = strtoupper(md5($unsignKey));
        $param[&#39;paySign&#39;] = $sign;
        return $param;
    }
ログイン後にコピー

2. 非同期コールバック

非同期コールバックでは、注文ステータスの変更、テキスト メッセージの送信、メッセージのプッシュなどの操作を実行します。

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

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

デモのダウンロード:

githubアドレス: https://github.com/pwstrick/weixin_demo

CSDNアドレス: http://download.csdn .net/detail/loneleaf1/9045731

WeChat パブリック プラットフォーム開発および WeChat 決済関連記事の詳細については、PHP 中国語 Web サイトに注目してください。



関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート