Heim >php教程 >php手册 >ThinkPays neueste WeChat-Zahlungstreiberfreigabe für offizielle Konten

ThinkPays neueste WeChat-Zahlungstreiberfreigabe für offizielle Konten

WBOY
WBOYOriginal
2016-12-01 00:00:171434Durchsuche

Teilen Sie die neuesten WeChat-Zahlungstreiber für offizielle Konten von ThinkPay
Lassen Sie uns den WeChat-Zahlungstreiber von ThinkPay für alle zugänglich machen. Wenn Sie Fragen haben, nehmen Sie bitte an der QQ-Gruppendiskussion 105108204 teil.<?php<br /> // +-------------------------------- --- --------<br /> // |. Zero Cloud [Einfach, effizient und ausgezeichnet]<br /> // +-------------------------------- --- --------<br /> // |. Copyright (c) 2016 http://www.lingyun.net Alle Rechte vorbehalten.<br /> // +-------------------------------- --- --------<br /> // |. Autor: jry <598821125@qq.com><br> // +-------------------------------- --- --------<br> Namespace AddonsPayThinkPayPayDriver;<br> <br> /**<br> * WeChat-Zahlungstreiber<br> ​*/<br> Klasse Wxpay erweitert AddonsPayThinkPayPayPay<br> {<br> protected $gateway = 'https://api.mch.weixin.qq.com/pay/unifiedorder';<br> Geschützt $orderquery = 'https://api.mch.weixin.qq.com/pay/orderquery';<br> protected $config = array(<br>                                                                                                                                                        'appsecret' => '',<br> „mchid“ => '',<br> 'Schlüssel' );<br> <br> Öffentliche Funktionsprüfung()<br> {<br> if (!$this->config['appid'] || !$this->config['appsecret'] || !$this->config['mchid'] || !$this-> config['key']) {<br> E("WeChat-Zahlungseinstellungen sind falsch!");<br>         }<br>          return true;<br> }<br> <br> Öffentliche Funktion buildRequestForm($pay_data)<br> {<br>              // APP-Zahlung<br> If (C('IS_API')) {<br>              $param = array(<br>                                                                                                                                                                                          > nicht gewesen sein“ 'Mch_id' = & gt; $ this- & gt;               'nonce_str'                                                                                                                                                                                                                                             weil                'Körper'                                                                                                                                                                                                                          'out_trade_no'                                                                                                                                                                                             'total_fee'                                                                                                                                                                                                         'spbill_create_ip' => $_SERVER['REMOTE_ADDR'],<br>               'notify_url'                                                                                                                                                                                                   durch               'trade_type'                                                                                                                                                                                                                                                                          );<br> <br> // Signatur              $param['sign'] = $this->MakeSign($param);<br>                                                                                                                                                                                $result = $this->FromXml($this->postXmlCurl($xml_param, $this->gateway));<br> If ($result['return_code'] === 'SUCCESS') {<br> If ($this->CheckSign($result)) {<br>                                                                                                                                              // Die einheitliche Bestellschnittstelle gibt die normale prepay_id zurück, generiert dann die Signatur gemäß der Signaturspezifikation neu und überträgt die Daten dann an die APP. <br> // Die an der Signatur beteiligten Felder heißen Appid, Partnerid, Prepayid, Noncestr, Timestamp, Package. Hinweis: Das Wertformat des Pakets ist Sign=WXPay<br> $prepayparams = array();<br>                        $prepayparams['appid']                                                                                                                                                   $prepayparams['partnerid'] = $result['mch_id'];<br>                        $prepayparams['prepayid'] = $result['prepay_id'];<br>                     $prepayparams['noncestr'] = $result['nonce_str'];<br>                           $prepayparams['package']                                                                                                                                                      $prepayparams['timestamp'] = time();<br>                           $prepayparams['sign']                                                                                                                                                                                           $ Return ['json'] = json_encode ($ prepayparams);                      return $return;<br>                 }<br>             }<br>            } sonst {<br>                               // Erhalten Sie die OpenID des Benutzers, die JSAPI-Zahlung für das öffentliche WeChat-Konto muss <br> sein               $openId = $this->GetOpenid();<br>              $param = array(<br>                                                                                                                                                                                          > nicht gewesen sein“ 'Mch_id' = & gt; $ this- & gt;                'nonce_str'        => $this->getNonceStr(),<br>                 'Körper'             => $pay_data['body'],<br>                 'out_trade_no'     => $pay_data['out_trade_no'],<br>                 'total_fee'        => $pay_data['money'] * 100,<br>                 'spbill_create_ip' => $_SERVER['REMOTE_ADDR'],<br>                 'notify_url'       => $this->config['notify_url'],<br>                 'trade_type'       => 'JSAPI',<br>                 'openid'           => $openId,<br>             );<br> <br>             // 签名<br>             $param['sign'] = $this->MakeSign($param);<br>             $xml_param     = $this->ToXml($param);<br>             $result        = $this->FromXml($this->postXmlCurl($xml_param, $this->gateway));<br>             if ($result['return_code'] === 'SUCCESS') {<br>                 if ($this->CheckSign($result)) {<br>                     // 获取JSAPI所需参数<br>                     $jsApiParameters = $this->GetJsApiParameters($result);<br>                     $pay_page        = <<<EOF<br />                         <html><br>                             <Kopf><br>                                 <meta http-equiv="content-type" content="text/html;charset=utf-8"/><br>                                 <meta name="viewport" content="width=device-width, initial-scale=1"/><br>                                 <title>微信支付</title><br>                                 <script type="text/javascript"><br>//WeChat JS API-Zahlung aufrufen<br> Funktion jsApiCall()<br>                                                                                        WeixinJSBridge.invoke(<br> „getBrandWCPayRequest“,<br>                                                                                                  Funktion(res){<br> WeixinJSBridge.log(res.err_msg);<br> aus } <br> );<br>                                                                                                                                                                                                                                                                                        } <br> Funktion callpay()<br>                                                                                         If (typeof WeixinJSBridge == "undefiniert"){<br> If(document.addEventListener){<br> document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);<br> } Else if (document.attachevent) {<br>                                             document.attachEvent('WeixinJSBridgeReady', jsApiCall);<br>                                             document.attachEvent('onWeixinJSBridgeReady', jsApiCall);<br>                                         }<br>                                     }else{<br>                                         jsApiCall();<br>                                     }<br>                                 }<br>                                 </script><br>                             </head><br>                             <body><br>                                 <br/><br>                                 <font color="#9ACD32"><b>该笔订单支付金额为<span style="color:#f00;font-size:50px">{$pay_data['money']}</span>元</b></font><br/><br/><br>                                 <div align="center"><br>                                     <button style="width:210px; height:50px; border-radius: 15px;background-color:#FE6714; border:0px #FE6714 solid; cursor: pointer; color:white; font-size:16px;" type="button" onclick="callpay()" >立即支付</button><br>                                 </div><br>                                                                                                                                                                                                          EOF;<br> Geben Sie $ pay_page zurück; <br>                 }<br>                                                                else {<br> E("WeChat-Bestellfehler!" . $result['return_msg']);<br>             }<br>         }<br> }<br> <br> /**<br> * * Asynchrone Benachrichtigungsüberprüfung<br> ​​*/<br> Öffentliche Funktion verifyNotify($notify)<br> {<br> ​​​​ //Benachrichtigungsdaten abrufen<br> If ($notify['return_code'] === 'SUCCESS') {<br> If (!array_key_exists("transaction_id", $notify)) {<br> E("Die Eingabeparameter sind falsch!");<br>             }<br>              $param['transaction_id'] = $notify["transaction_id"];<br>               $param['appid']                                                                                                                                                                                                                                           durch               $param['mch_id']                                                                                                                                                                                                                                          durch                 $param['nonce_str']                                                                                                                                                                                                     $param['sign'] = $this->MakeSign($param);<br>                                                                                                                                                  $result = $this->FromXml($this->postXmlCurl($xml_param, $this->orderquery));<br> If ($this->CheckSign($result)) {<br>               $result['status'] = ($result['result_code'] == 'SUCCESS') ? true : false;<br>                $result['money'] = $result['total_fee'] / 100;<br>                      $this->info                                                                                                                                                                                                     return true;<br>             }<br>            } sonst {<br> E('Fehler melden');<br>         }<br> }<br> <br> /**<br> *<br> * JSAPI-Zahlungsparameter abrufen<br> * @param-Array $UnifiedOrderResult Von der einheitlichen Zahlungsschnittstelle zurückgegebene Daten<br> * @throws WxPayException<br>*<br> * @return JSON-Daten, die direkt als Parameter <br> in die JS-Funktion eingefügt werden können */<br> Öffentliche Funktion GetJsApiParameters($UnifiedOrderResult)<br> {<br> If (!array_key_exists("appid", $UnifiedOrderResult)<br>                                                                                                                                   ||. $UnifiedOrderResult['prepay_id'] == "") {<br> E("Parameterfehler");<br>        }<br>         $jsapi['appId']                                                                                  $jsapi['timeStamp'] = (string) time();<br>          $jsapi['nonceStr'] = $this->getNonceStr();<br>          $jsapi['appId']                                                                                                                                         $jsapi['package'] = "prepay_id=" . $UnifiedOrderResult['prepay_id'];<br>          $jsapi['signType'] = 'MD5';<br>          $jsapi['paySign']                                                                                                                       $parameters = json_encode($jsapi);<br>           $parameters zurückgeben;<br> }<br> <br> /**<br> * Senden Sie XML im Post-Modus an die entsprechende Schnittstellen-URL<br> *<br> * @param string $xml XML-Daten für den Beitrag erforderlich<br> * @param string $url url<br> * @param bool $useCert Ob ein Zertifikat erforderlich ist, standardmäßig nicht erforderlich<br> * @param int $second URL-Ausführungszeitlimit, Standard 30s<br> * @throws WxPayException<br> ​​*/<br> Private statische Funktion postXmlCurl($xml, $url, $useCert = false, $second = 30)<br> {<br>          $ch = curl_init();<br> ​​​​ //Timeout festlegen<br>         curl_setopt($ch, CURLOPT_TIMEOUT, $second);<br> <br> ​​​​ //Wenn ein Proxy konfiguriert ist, legen Sie den Proxy hier fest<br>             // if(WxPayConfig::CURL_PROXY_HOST != "0.0.0.0"<br>                                                                                                                                                                                                                    curl_setopt($ch,CURLOPT_PROXY, WxPayConfig::CURL_PROXY_HOST);<br>                                    curl_setopt($ch,CURLOPT_PROXYPORT, WxPayConfig::CURL_PROXY_PORT);<br>                                                                                                    }         curl_setopt($ch, CURLOPT_URL, $url);<br> curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);<br>         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); //Strenge Überprüfung<br> ​​​​ //Header festlegen<br>         curl_setopt($ch, CURLOPT_HEADER, false);<br> ​​​​ //Das Ergebnis muss eine Zeichenfolge sein und auf dem Bildschirm ausgegeben werden<br>curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);<br> <br> If ($useCert == true) {<br>                                                                                                                                                                                                              um das Zertifikat einzurichten <br>                   //Zertifikat verwenden: Zertifikat und Schlüssel gehören jeweils zu zwei .pem-Dateien <br>             curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM');<br>             curl_setopt($ch, CURLOPT_SSLCERT, WxPayConfig::SSLCERT_PATH);<br>              curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');<br>             curl_setopt($ch, CURLOPT_SSLKEY, WxPayConfig::SSLKEY_PATH);<br>         }<br> ​​​​ //Post-Einreichungsmethode<br>         curl_setopt($ch, CURLOPT_POST, true);<br>         curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);<br> ​​​​ //Run Curl<br>         $data = curl_exec($ch);<br>                //Ergebnisse zurückgeben<br>           if ($data) {<br>                curl_close($ch);<br>                 return $data;<br>            } sonst {<br>               $error = curl_errno($ch);<br>                curl_close($ch);<br> E("Curl-Fehler, Fehlercode: $error");<br>         }<br> }<br> <br> /*<br> * Generieren Sie eine zufällige Zeichenfolge, nicht länger als 32 Zeichen <br> * @param int $length<br> * * @return Zufälliger String generiert <br> */<br> Öffentliche statische Funktion getNonceStr($length = 32)<br> {<br> ​​​​$chars = "abcdefghijklmnopqrstuvwxyz0123456789";<br>                                                                     $str                                                                                           for ($i = 0; $i < $length; $i++) {<br />               $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);<br />         }<br />           return $str;<br /> }<br /> <br /> /**<br /> * Signatur generieren<br /> * @return Signature, diese Funktion deckt die Sign-Membervariable nicht ab. Wenn Sie die Signatur festlegen möchten, müssen Sie die SetSign-Methode aufrufen, um einen Wert <br /> zuzuweisen ​​*/<br /> Öffentliche Funktion MakeSign($param)<br /> {<br /> ​​​​ //Signaturschritt 1: Parameter in lexikografischer Reihenfolge sortieren<br />          ksort($param);<br />          $string = $this->ToUrlParams($param);<br> ​​​​ //Signaturschritt 2: KEY<br> nach der Zeichenfolge hinzufügen $string = $string . "&key=" . $this->config['key'];<br> ​​​​ //Signaturschritt drei: MD5-Verschlüsselung<br>         $string = md5($string);<br> ​​​​ //Signaturschritt 4: Alle Zeichen in Großbuchstaben umwandeln<br>         $result = strtoupper($string);<br>           return $result;<br> }<br> <br> /**<br> *<br>     * 检测签名<br>      */<br>     öffentliche Funktion CheckSign($param)<br>     {<br>         $sign = $this->MakeSign($param);<br>         if ($param['sign'] == $sign) {<br>             return true;<br>         } else {<br>             E("签名错误!");<br>         }<br>     }<br> <br>     /**<br> *<br> * * Signaturzeichenfolge verbinden<br> * @param-Array $urlObj<br> *<br> * @return Gibt die verkettete Zeichenfolge <br> zurück ​​*/<br>     öffentliche Funktion ToUrlParams($param)<br>     {<br>         $buff = "";<br>         foreach ($param as $k => $v) {<br>             if ($k != "sign" && $v != "" && !is_array($v)) {<br>                 $buff .= $k . "=" . $v . "&";<br>             }<br>         }<br> <br>         $buff = trim($buff, "&");<br>         return $buff;<br>     }<br> <br>     /**<br> * XML-Zeichen ausgeben <br> * @throws WxPayException<br> **/<br>     öffentliche Funktion ToXml($param)<br>     {<br>         if (!is_array($param)<br>             || count($param) <= 0) {<br />             E("数组数据异常!");<br />         }<br /> <br />         $xml = "<xml>";<br>         foreach ($param as $key => $val) {<br>             if (is_numeric($val)) {<br>                 $xml .= "<" . $key . ">" . $val . "</" . $key . ">";<br>             } else {<br>                 $xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">";<br>             }<br>         }<br>         $xml .= "</xml>";<br>         return $xml;<br>     }<br> <br>     /**<br> * XML in Array konvertieren<br> * @param string $xml<br> * @throws WxPayException<br> ​​*/<br>     öffentliche Funktion FromXml($xml)<br>     {<br>         if (!$xml) {<br>             E("xml数据异常!");<br>         }<br>​​​​ //XML in Array konvertieren<br> ​​​​ //Das Verweisen auf externe XML-Entitäten ist verboten<br> ​​​​libxml_disable_entity_loader(true);<br>         $this->values ​​​​= json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);<br>           $this->values;<br> zurückgeben }<br> <br> /**<br> *<br> * Holen Sie sich die OpenID des Benutzers durch Jump. Der Jump-Prozess ist wie folgt: <br> * 1. Legen Sie die URL und andere Parameter fest, die Sie zum Rückruf benötigen, und springen Sie zum WeChat-Server https://open.weixin.qq.com/connect/oauth2/authorize<br> * 2. Nachdem die Verarbeitung des WeChat-Dienstes abgeschlossen ist, wird zur Redirect_uri-Adresse des Benutzers zurückgesprungen. Zu diesem Zeitpunkt werden einige Parameter angezeigt, z. B.: Code<br> *<br> * @return Benutzer-OpenID<br> ​​*/<br> Öffentliche Funktion GetOpenid()<br> {<br> ​​​​ //Openid über Code abrufen<br> If (!isset($_GET['code'])) {<br> //WeChat-Rückgabecode auslösen <br> $baseUrl = urlencode('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);<br>                                                                                                                                                  Header("Standort: $url");<br> exit();<br>            } sonst {<br>                              //Holen Sie sich den Codecode, um die OpenID zu erhalten<br> $code = $_GET['code'];<br>              $openid = $this->getOpenidFromMp($code);<br>                  return $openid;<br>        }<br> }<br> <br> /**<br> *<br> * Holen Sie sich das OpenID-Maschinenzugriffstoken über Code von der Arbeitsplattform<br> * @param string $code Der von WeChat zurückgebrachte Code<br> *<br> * @return openid<br> ​​*/<br> Öffentliche Funktion GetOpenidFromMp($code)<br> {<br>          $url = $this->__CreateOauthUrlForOpenid($code);<br> ​​​​ // Curl initialisieren<br>          $ch = curl_init();<br> ​​​​ //Timeout festlegen<br>         curl_setopt($ch, CURLOPT_TIMEOUT, $this->curl_timeout);<br>         curl_setopt($ch, CURLOPT_URL, $url);<br>         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);<br>         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);<br>         curl_setopt($ch, CURLOPT_HEADER, false);<br> curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);<br>             // if(WxPayConfig::CURL_PROXY_HOST != "0.0.0.0"<br>                                                                                                                                                                                                                    curl_setopt($ch,CURLOPT_PROXY, WxPayConfig::CURL_PROXY_HOST);<br>        //             curl_setopt($ch,CURLOPT_PROXYPORT, WxPayConfig::CURL_PROXY_PORT);<br>         //         }<br>         //运行curl,结果以jason形式返回<br>         $res = curl_exec($ch);<br>         curl_close($ch);<br>         //取出openid<br>         $data       = json_decode($res, true);<br>         $this->data = $data;<br>         $openid     = $data['openid'];<br>         return $openid;<br>     }<br> <br>     /**<br> *<br> * Erstellen Sie die URL-Verbindung, um den Code zu erhalten<br> * @param string $redirectUrl Die URL, die der WeChat-Server zurücksendet, erfordert URL-Kodierung<br> *<br> * @return Gibt die konstruierte URL zurück<br> ​​*/<br>     private Funktion __CreateOauthUrlForCode($redirectUrl)<br>     {<br>         $urlObj["appid"]         = $this->config['appid'];<br>         $urlObj["redirect_uri"]  = "$redirectUrl";<br>         $urlObj["response_type"] = "code";<br>         $urlObj["scope"]         = "snsapi_base";<br>         $urlObj["state"]         = "#wechat_redirect";<br>         $bizString               = $this->ToUrlParams($urlObj);<br>         return "https://open.weixin.qq.com/connect/oauth2/authorize?" . $bizString;<br>     }<br> <br>     /**<br> *<br> * Konstrukt, um die URL-Adresse von open und access_toke<br> zu erhalten * @param string $code, der vom WeChat-Sprung zurückgebrachte Code<br> *<br> * @return angeforderte URL<br> ​​*/<br>     private Funktion __CreateOauthUrlForOpenid($code)<br>     {<br>         $urlObj["appid"]      = $this->config['appid'];<br>         $urlObj["secret"]     = $this->config['appsecret'];<br>         $urlObj["code"]       = $code;<br>         $urlObj["grant_type"] = "authorization_code";<br>         $bizString            = $this->ToUrlParams($urlObj);<br>         return "https://api.weixin.qq.com/sns/oauth2/access_token?" . $bizString;<br>     }<br> }

Stellungnahme:
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
Vorheriger Artikel:Linux-Installation pdo_mysqlNächster Artikel:Linux-Installation pdo_mysql