首頁 php教程 php手册 ThinkPay最新微信支付公眾號支付驅動分享

ThinkPay最新微信支付公眾號支付驅動分享

Dec 01, 2016 am 12:00 AM

ThinkPay最新微信支付公眾號支付驅動分享
以下分享個ThinkPay的微信支付驅動,方便大家使用,如有疑問加QQ群討論105108204<?php <br /> // +----------------------------------------------- -----------------------<br> // | 零雲 [ 簡單 高效率 卓越 ]<br> // +----------------------------------------------- -----------------------<br> // | Copyright (c) 2016 http://www.lingyun.net All rights reserved.<br> // +----------------------------------------------- -----------------------<br> // | Author: jry <br> // +----------------------------------------------- -----------------------<br> namespace AddonsPayThinkPayPayDriver;<br> <br> /**<br>  * 微信支付驅動<br>  */<br> class Wxpay extends AddonsPayThinkPayPayPay<br> {<br>     protected $gateway    = 'https://api.mch.weixin.qq.com/pay/unifiedorder';<br>     protected $orderquery = 'https://api.mch.weixin.qq.com/pay/orderquery';<br>     protected $config     = array(<br>         'appid'     => '',<br>         'appsecret' => '',<br>         'mchid'     => '',<br>         'key'       => '',<br>     );<br> <br>     public function check()<br>     {<br> if (!$this->config['appid'] || !$this->config['appsecret'] || !$this->config['mchid'] || !$this->config['key ']) {<br>             E("微信支付設定錯誤!");<br>         }<br>         return true;<br>     }<br> <br>     public function buildRequestForm($pay_data)<br>     {<br>         // APP付款<br>         if (C('IS_API')) {<br>             $param = array(<br>                 'appid'            => $this->config['appid']<br>                 'mch_id'           => $this->config['mchid'],<br>                 'nonce_str'        => $this->getNonceStr(),<br>                 'body'             => $pay_data['body's),<br>                 'out_trade_no'     => $pay_data['out_trade_no'],<br>                 'total_fee'        => $pay_data['money'] * 100,<br>=> $pay_data['money'] * 100,<br>                 'spbill_create_ip' => $_SERVER['REMOTE_ADDR'],<br>                 'notify_url'       => $this->config['notify_url'],<br>                 'trade_type'       => 'APP',🎜            );<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>                     // 統一單一介面回復中正常的prepay_id,並依簽章規範重新產生簽章後,傳送資料至APP。 <br>                     // 參與所簽署的欄位名為appId,partnerId,prepayId,nonceStr,timeStamp,問題。注意:package的值格式為Sign=WXPay<br>                     $prepayparams                                    $prepayparams['appid']     = $result['appid'                     $prepayparams['partnerid'] = $result['mch_id'];<br>                     $prepayparams['prepayid']  = $result['prepay_id'];<br>                     $prepayparams['noncestr']  = $result['nonce_str'];<br>                     $prepayparams['package']   = 'Sign=WXPay';<br>                     $prepayparams['timestamp'] = time();<br>                     $prepayparams['sign']      = $                     $return['json']                                 return $return;<br>                 }<br>             }<br>         } else {<br>             // 取得使用者openId,微信公編號JSAPI付款必須<br>             $openId = $this->GetOpenid();<br>             $param  = array(<br>                 'appid'            => $this->config['appid']<br>                 'mch_id'           => $this->config['mchid'],<br>                'nonce_str'        => $this->getNonceStr(),<br>                 '身體'             => $pay_data['body'],<br>                 'out_trade_no'     =>; $pay_data['out_trade_no'],<br>                 'total_fee'        => $pay_data['money'] * 100,<br>                 'spbil_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>             $結果        = $this->FromXml($this->postXmlCurl($xml_param, $this->gateway));<br>             if ($result['return_code'] === '成功') {<br>                 if ($this->CheckSign($result)) {<br>                     // 取得JSAPI所需參數<br>                     $jsApiParameters = $this->GetJsApiParameters($result);<br>                     $pay_page        =                          <br>                             <br>                                 <meta> <br>                                 <meta name="viewport" content="width=device-width,initial-scale=1"> <br>                                 <title>微信支付</title> <br>                                 <br>                                //使用微函JS                                  function jsApiCall()<br>                                 {<br>                                  地                                                                                                                                                                                                                                                                   地                                 }<br> <br>                                 function callpay()<br>                                 {<br>                                                                                                          se);<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>                             和><br>                             <br> EOF;<br>                     return $pay_page;<br>                 }<br>             } else {<br>                 E("微信訂單錯誤!" . $result['return_msg']);<br>             }<br>         }<br>     }<br> <br>     /**<br>      * 非同步通知驗證<br>      */<br>     public function verifyNotify($notify)<br>     {<br>         //取得通知的資料<br>         if ($notify['return_code'] === 'SUCCESS') {<br>             if (!array_key_exists("transaction_id", $notify)) {<br>                 E("輸入參數不正確!");<br>             }<br>             $param['transaction_id'] = $notify["transaction_id"];<br>             $param['appid']          = $this->config['appid'];<br>             $param['mch_id']         = $this->config['mchid'];<br>             $param['nonce_str']      = $this->getNonceStr();<br>             $param['sign']           = $this->MakeSign($param);<br>             $xml_param               = $this->ToXml($param);<br>             $result                   = $1_FromXquecafid);             if ($this->CheckSign($result)) {<br>                 $result['status'] = ($result['result_code'] == 'SUCCESS')  true : false'] == 'SUCCESS')  true : false;                 $result['money']  = $result['total_fee'] / 100;<br>                 $this->info       = $result;<br>                 return true;<br>             }<br>         } else {<br>             E('通知錯誤』);<br>         }<br>     }<br> <br>     /**<br>      *<br>      * 取得jsapi支付的參數<br>      * @param array $UnifiedOrderResult 統一支付介面回傳的資料<br>      * @throws WxPayException<br>     *<br>      * @return json數據,可直接填入js函數為參數<br>      */<br>     公共函數 GetJsApiParameters($UnifiedOrderResult)<br>     {<br>         if (!array_key_exists("appid", $UnifiedOrderResult)<br>             || !array_key_exists("prepay_id", $UnifiedOrderResult)<br>             || $UnifiedOrderResult['prepay_id'] == "") {<br>             E("參數錯誤");<br>         }<br>         $jsapi['appId']     = $UnifiedOrderResult["appid"];<br>         $jsapi['timeStamp'] = (string) time();<br>         $jsapi['nonceStr']  = $this->getNonceStr();<br>         $jsapi['appId']     = $UnifiedOrderResult["appid"];<br>         $jsapi['package']   = 「prepay_id=」 . $UnifiedOrderResult['prepay_id'];<br>         $jsapi['signType'] = 'MD5';<br>         $jsapi['paySign']   = $this->MakeSign($jsapi);<br>         $parameters         = json_encode($jsapi);<br>         返回$參數;<br>     }<br> <br>     /**<br>      * 以post方式提交xml到對應的介面url<br>      *<br>      * @param string $xml  需要post的xml資料<br>      * @param string $url  url<br>      * @param bool $useCert 是否需要證書,預設不需要<br>      * @param int $second   url執行逾時時間,預設為30s<br>      * @throws WxPayException<br>      */<br>     私人靜態函數 postXmlCurl($xml, $url, $useCert = false, $second = 30)<br>     {<br>         $ch = curl_init();<br>         //設定逾時<br>         curl_setopt($ch, CURLOPT_TIMEOUT, $second);<br> <br>         //如果有設定代理這裡就設定代理<br>         // if(WxPayConfig::CURL_PROXY_HOST != 「0.0.0.0」<br>         //             && WxPayConfig::CURL_PROXY_PORT != 0){<br>         //             curl_setopt($ch,CURLOPT_PROXY, WxPayConfig::CURL_PROXY_HOST);<br>         //             curl_setopt($ch,CURLOPT_PROXYPORT, WxPayConfig::CURL_PROXY_PORT);<br>         //         }<br>         curl_setopt($ch, CURLOPT_URL, $url);<br>         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);<br>         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // 嚴格驗證<br>         //設定header<br>         curl_setopt($ch, CURLOPT_HEADER, false);<br>         //要求結果為字串且輸出至螢幕上<br>        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);<br> <br>         if ($useCert == true) {<br>             //設定憑證<br>             //使用證明:cert 與 key 分別為兩個.pem檔案<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提交方式<br>         curl_setopt($ch, CURLOPT_POST, true);<br>         curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);<br>         //運轉curl<br>         $data = curl_exec($ch);<br>         //回診結果<br>         if ($data) {<br>             curl_close($ch);<br>             return $data;<br>         } else {<br>             $error = curl_errno($ch);<br>             curl_close($ch);<br>             E("curl出錯,錯誤碼:$error");<br>         }<br>     }<br> <br>     /*<br>      * 產生隨機字串,且不長於32位元<br>      * @param int $length<br>      * @return 所產生的隨機字串<br>      */<br>     public static function getNonceStr($length = 32)<br>     {<br>         $chars = "abcdefghijklmnopqrstuvwxyz0123456789";<br>         $str   = "";<br>         for ($i = 0; $i              $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);<br>         }<br>         return $str;<br>     }<br> <br>     /**<br>      * 產生簽章<br>      * @return 簽名,本函數不覆寫sign成員變量,如設定簽章需要呼叫SetSign方法賦值<br>      */<br>     public function MakeSign($param)<br>     {<br>         //簽章步驟一:依字典序排序參數<br>         ksort($param);<br>         $string = $this->ToUrlParams($param);<br>         //簽章步驟二:string後加入KEY<br>         $string = $string . "&key=" . $this->config['key'];<br>         //簽章步驟三:MD5加密<br>         $string = md5($string);<br>         //簽名步驟四:所有字元轉為大寫<br>         $result = strtoupper($string);<br>         return $result;<br>     }<br> <br>     /**<br>      *<br>     * 偵測簽章<br>      */<br>     公用函數 CheckSign($param)<br>     {<br>         $sign = $this->MakeSign($param);<br>         if ($param['sign'] == $sign) {<br>             則回 true;<br>         } 另外 {<br>             E("簽署錯誤!");<br>         }<br>     }<br> <br>     /**<br>      *<br>      * 拼接簽章字串<br>      * @param array $urlObj<br>      *<br>      * @return 回傳已拼接的字串<br>      */<br>     公用函數 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=修剪($buff,「&」);<br>         返回 $buff;<br>     }<br> <br>     /**<br>      * 輸出xml字元<br>      * @throws WxPayException<br>      **/<br>     公用函數 ToXml($param)<br>     {<br>         if (!is_array($param)<br>             || 計數($param)              E("備份資料異常!");<br>         }<br> <br>         $xml = 「<xml>」;<br>         foreach($param as $key => $val){<br>             如果(is_numeric($val)){<br>                 $xml.=「” 。 $val。 “”。 $鍵。 「>」;<br>             } 另有 {<br>                 $xml.=「」。 $鍵。 「>」;<br>             }<br>         }<br>         $xml .= 「</xml>」;<br>         返回 $xml;<br>     }<br> <br>     /**<br>      * 將xml轉換至array<br>      * @param string $xml<br>      * @throws WxPayException<br>      */<br>     公用函數FromXml($xml)<br>     {<br>         如果(!$ xml){<br>             E("xml資料異常!");<br>         }<br>        //將XML轉為array<br>         //禁止引用外部xml實體<br>         libxml_disable_entity_loader(true);<br>         $this->values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);<br>         return $this->values;<br>     }<br> <br>     /**<br>      *<br>      * 透過跳躍獲取使用者的openid,跳轉流程如下:<br>      * 1、設定自己需要調回的url及其其他參數,跳到微信伺服器https://open.weixin.qq.com/connect/oauth2/authorize<br>      * 2、微信服務處理完成後會跳到使用者redirect_uri位址,此時會帶著一些參數,如:code<br>      *<br>      * @return 使用者的openid<br>      */<br>     public function GetOpenid()<br>     {<br>         //透過code取得openid<br>         if (!isset($_GET['code'])) {<br>             //觸發微訊號回復code碼<br>             $baseUrl = urlencode('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);<br>             $url     = $this->__CreateOauthUrlForCode($baseUrl);<br>             Header("Location: $url");<br>             exit();<br>         } else {<br>             //取得code碼,以取得openid<br>             $code   = $_GET['code'];<br>             $openid = $this->getOpenidFromMp($code);<br>             return $openid;<br>         }<br>     }<br> <br>     /**<br>      *<br>      * 透過code從工作平台取得openid機器access_token<br>      * @param string $code 微信跳轉回帶上的code<br>      *<br>      * @return openid<br>      */<br>     public function GetOpenidFromMp($code)<br>     {<br>         $url = $this->__CreateOauthUrlForOpenid($code);<br>         //初始化curl<br>         $ch = curl_init();<br>         //設定逾時<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>         //             && WxPayConfig::CURL_PROXY_PORT != 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>         回 $openid;<br>     }<br> <br>     /**<br>      *<br>      * 構造取得code的url連結<br>      * @param string $redirectUrl 微信伺服器回跳的url,需要url編碼<br>      *<br>      * @return 返回構造好的url<br>      */<br>     私人函數__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>         返回「https://open.weixin.qq.com/connect/oauth2/authorize?」 。 $bizString;<br>     }<br> <br>     /**<br>      *<br>      * 建構取得open和access_toke的url位址<br>      * @param string $code,微信跳轉帶回的code<br>      *<br>      * @return 請求的url<br>      */<br>     私人函數__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>         返回「https://api.weixin.qq.com/sns/oauth2/access_token?」 。 $bizString;<br>     }<br> }

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

了解Python編程的入門級程式碼範例 了解Python編程的入門級程式碼範例 Jan 04, 2024 am 10:50 AM

了解Python編程的入門級程式碼範例

PHP 變數的實際應用:10 個實際使用範例 PHP 變數的實際應用:10 個實際使用範例 Feb 19, 2024 pm 03:00 PM

PHP 變數的實際應用:10 個實際使用範例

從入門到精通:Go語言中常用資料結構的程式碼實現 從入門到精通:Go語言中常用資料結構的程式碼實現 Mar 04, 2024 pm 03:09 PM

從入門到精通:Go語言中常用資料結構的程式碼實現

如何使用PHP編寫庫存管理系統中的庫存分倉管理功能代碼 如何使用PHP編寫庫存管理系統中的庫存分倉管理功能代碼 Aug 06, 2023 pm 04:49 PM

如何使用PHP編寫庫存管理系統中的庫存分倉管理功能代碼

Java實作簡單的冒泡排序程式碼 Java實作簡單的冒泡排序程式碼 Jan 30, 2024 am 09:34 AM

Java實作簡單的冒泡排序程式碼

Go語言程式設計實例:Web開發中的程式碼範例 Go語言程式設計實例:Web開發中的程式碼範例 Mar 04, 2024 pm 04:54 PM

Go語言程式設計實例:Web開發中的程式碼範例

華為雲端邊緣運算對接指南:Java程式碼範例快速實作接口 華為雲端邊緣運算對接指南:Java程式碼範例快速實作接口 Jul 05, 2023 pm 09:57 PM

華為雲端邊緣運算對接指南:Java程式碼範例快速實作接口

指導與範例:學習Java選擇排序演算法的實現 指導與範例:學習Java選擇排序演算法的實現 Feb 18, 2024 am 10:52 AM

指導與範例:學習Java選擇排序演算法的實現

See all articles