Die öffentliche Plattform WeChat entwickelt WeChat-Zahlung

高洛峰
Freigeben: 2017-03-01 09:59:09
Original
1810 Leute haben es durchsucht

1. JS-SDK

Die WeChat-Zahlung im offiziellen Konto muss über JS implementiert werden. WeChat JS-SDK ist ein auf WeChat basierendes Webentwicklungs-Toolkit, das von der öffentlichen WeChat-Plattform für Webentwickler bereitgestellt wird.

1) JS-Skriptdatei importieren

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

2) Konfiguration der Berechtigungsüberprüfung über die Konfigurationsschnittstelle einfügen

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

appId ist die Anwendungs-ID, die Zeichenfolge, die mit beginnt wx,timestamp wird mit time() in PHP abgerufen, während nonceStr mit uniqid() abgerufen wird und signature nach einem bestimmten Algorithmus abgerufen wird.

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;
    }
Nach dem Login kopieren

Hier ist eine Beschreibung von „jsapi_ticket“ ist ein temporäres Ticket, das von öffentlichen Konten zum Aufrufen der WeChat JS-Schnittstelle verwendet wird. Unter normalen Umständen beträgt die Gültigkeitsdauer von jsapi_ticket 7200 Sekunden, die über access_token abgerufen wird. Da es ein Zeitlimit gibt und die Anzahl der API-Aufrufe zum Erhalten von jsapi_ticket sehr begrenzt ist, werde ich das erhaltene jsapi_ticket in MongoDB speichern.

/**
     * 通过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;
    }
Nach dem Login kopieren

3) Verarbeiten Sie die erfolgreiche Verifizierung über die fertige Schnittstelle

1) prepay_id Sie wird basierend auf der lokal generierten Bestellnummer usw. erhalten. Die Bestellnummer ist jedes Mal anders, wenn Sie sie anfordern, andernfalls wird ein Fehler gemeldet

2) Verwenden Sie für nonceStr md5(uniqid(' baiaimama'))Get

3) signType verwendet MD5

4) paySign wird durch Sortieren und Verketten gemäß den Parametern des Codes erhalten.

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) {
        // 支付成功后的回调函数
    }
});
Nach dem Login kopieren

/**
     * 生成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;
    }
Nach dem Login kopieren

2. Asynchrone Rückrufe

Führen Sie im asynchronen Rückruf einige Vorgänge aus, z. B. das Ändern des Bestellstatus, das Senden von Textnachrichten und das Senden von Nachrichten.

/**
     * 微信支付异步回调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);
    }
Nach dem Login kopieren

Demo-Download:

Github-Adresse: https://github.com/pwstrick/weixin_demo

CSDN-Adresse: http://download.csdn.net/detail /loneleaf1/9045731

Weitere Artikel zur Entwicklung öffentlicher WeChat-Plattformen und WeChat-Zahlungen finden Sie auf der chinesischen PHP-Website!



Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage