這篇文章給大家分享的是有關(guān)微信開(kāi)發(fā)中如何實(shí)現(xiàn)微信支付的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
創(chuàng)新互聯(lián)公司2013年至今,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都做網(wǎng)站、網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元類烏齊做網(wǎng)站,已為上家服務(wù),為類烏齊各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220
一、 微信后臺(tái)設(shè)置
1.添加測(cè)試授權(quán)目錄和測(cè)試白名單:
在微信后臺(tái),設(shè)置測(cè)試授權(quán)目錄,如xxx.sinaapp.com/example/,測(cè)試白名單中添加你的微信號(hào)。
注意,這里的“個(gè)人微信號(hào)”既不是qq號(hào)也不是個(gè)人昵稱。而是登錄微信后在“我”界面中的“微信號(hào)”字段的字符串。
支付授權(quán)目錄設(shè)不設(shè)無(wú)所謂,因?yàn)槲覀冎皇菧y(cè)試。
2.列表內(nèi)容
設(shè)置網(wǎng)頁(yè)授權(quán)域名:
在“開(kāi)發(fā)者中心/接口權(quán)限表/網(wǎng)頁(yè)賬號(hào)/網(wǎng)頁(yè)授權(quán)獲取用戶基本信息”中進(jìn)行設(shè)置。網(wǎng)頁(yè)授權(quán)域名設(shè)置為測(cè)試服務(wù)器的域名,如:xxx.sinaapp.com,不需要http://。
1.下載證書
在“賬戶設(shè)置/API安全/API證書”中下載。需要用到管理員的手機(jī)驗(yàn)證碼。下載后的進(jìn)行解壓縮,我們需要用到的是apiclient_key.pem和apiclient_cert.pem。
2.生成支付key
在“賬戶設(shè)置/API安全/API密鑰”中進(jìn)行設(shè)置。支付key將在支付時(shí)用到,這個(gè)值就是源代碼配置文件中的KEY常量。
1、在Wxpay.pub.config.php修改配置,主要是:
const APPID //公眾號(hào)中“開(kāi)發(fā)者中心”看到的AppID const MCHID //微信支付商戶資料審核成功郵件中的商戶號(hào) const KEY //你在商戶平臺(tái)中設(shè)置的支付key const APPSECRET //公眾號(hào)中“開(kāi)發(fā)者中心”看到的AppSecret const JS_API_CALL_URL //設(shè)置這個(gè)url,可在此頁(yè)面中獲得用戶的openid。 //證書路徑,注意應(yīng)該填寫絕對(duì)路徑 const SSLCERT_PATH // apiclient_cert.pem文件url const SSLKEY_PATH // apiclient_key.pem文件url,如’/cert/ apiclient_key.pem’ const NOTIFY_URL //異步通知url,可使用demo中的notify_url.php
2、修改官方代碼中的bug:
如果出現(xiàn)“curl_setopt() expects parameter 2 to be long”錯(cuò)誤,是因?yàn)閃xPayPubHelper.php中有幾個(gè)地方將“curl_setopt”拼錯(cuò)了,拼成“curl_setop”,將其修改后即可。如果出現(xiàn)“curl_close(): 11 is not a valid”,則是因?yàn)殄e(cuò)誤地關(guān)閉了一個(gè)已經(jīng)關(guān)閉的curl session,可以將curl_close()代碼加上如下判斷:
if(gettype($ch) == 'resource') curl_close($ch);
3、官方demo直接跑不通,我們需要自己搞定它。首先中index.php中增加一個(gè)鏈接:
獲取openid
3、 然后寫一個(gè)pay.php頁(yè)面,用于獲取用戶openid并發(fā)起支付:
createOauthUrlForCode(WxPayConf_pub::JS_API_CALL_URL); Header("Location: $url"); } else { // 獲取code碼,以獲取openid $code = $_GET['code']; $jsApi->setCode($code); $openid = $jsApi->getOpenId(); } $goods = "test"; // 使用統(tǒng)一支付接口 $unifiedOrder = new UnifiedOrder_pub(); $unifiedOrder->setParameter("openid", "$openid"); // 用戶openid $unifiedOrder->setParameter("body", "$goods"); // 商品描述 // 自定義訂單號(hào),此處僅作舉例 $timeStamp = time(); $out_trade_no = WxPayConf_pub::APPID . "$timeStamp"; // 商戶訂單號(hào) $unifiedOrder->setParameter("out_trade_no", "$out_trade_no"); $price = "1"; $unifiedOrder->setParameter("total_fee", "$price"); // 總金額 $unifiedOrder->setParameter("notify_url", WxPayConf_pub::NOTIFY_URL); // 通知地址 $unifiedOrder->setParameter("trade_type", "JSAPI"); // 交易類型 $prepay_id = $unifiedOrder->getPrepayId(); // =========步驟3:使用jsapi調(diào)起支付============ $jsApi->setPrepayId($prepay_id); $jsApiParameters = $jsApi->getParameters(); echo $jsApiParameters; ?>微信安全支付
openID | |
商品名稱 | |
訂單號(hào) | |
prepay_id | |
價(jià)格 |
1、下載官方示例代碼
最新SDK版本為V3.7,但我們不要去下V3.7的demo(那個(gè)例子跑不通),而是要去下V3的例子:
pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1
2、將demo解壓縮放到你的web根目錄下。比如,壓縮包解開(kāi)后的目錄是WxpayAPI_php_v3,你要進(jìn)入這個(gè)目錄后將所有文件選中,然后復(fù)制到你的項(xiàng)目目錄中去。在這個(gè)目錄中有一個(gè)index.php,那么到測(cè)試時(shí)候需要訪問(wèn) xxx.sinaapp.com/index.php。
3、將index.php中的標(biāo)簽的url地址改為你服務(wù)器上的url地址。
4、在你的微信中,隨便打開(kāi)一個(gè)對(duì)話窗口,輸入index.php地址,如xxx.sinaapp.com/index.php,然后在對(duì)話窗口中點(diǎn)擊這個(gè)鏈接。會(huì)出現(xiàn)幾個(gè)按鈕,點(diǎn)“JSAPI支付”的按鈕,即可彈出支付金額為1分錢的窗口,輸入收貨人,支付。即會(huì)彈出支付成功界面。
到這一步,說(shuō)明官方的支付代碼是基本可用的,接下來(lái),我們可以在它的基礎(chǔ)上修改成自己的代碼。
5、替換cert目錄下的apiclient_key.pem和apiclient_cert.pem成你自己的證書。
6、修改WxPay.Config.php中的以下幾項(xiàng)成你自己的:
const APPID //公眾號(hào)中“開(kāi)發(fā)者中心”看到的AppID const MCHID //微信支付商戶資料審核成功郵件中的商戶號(hào) const KEY //你在商戶平臺(tái)中設(shè)置的支付key const APPSECRET //公眾號(hào)中“開(kāi)發(fā)者中心”看到的AppSecret
7、因?yàn)槲覀兪褂昧藄ina的sae作為測(cè)試服務(wù)器,sae不允許直接寫文件io,因此可以將官網(wǎng)代碼中的文件操作進(jìn)行相應(yīng)的修改(使用SaeStorage)。也就是需要修改log.php中的CLogFileHandler類:
class CLogFileHandler implements ILogHandler { private $fn=null; private $ss=null; public function construct($file = '') { $this->fn=str_replace("../logs/", "", $file); $this->ss=new SaeStorage(); } public function write($msg) { $bytes = $this->ss->read('log', $this->fn); $str = $bytes; $this->ss->write('log', $this->fn, "$str\n$msg"); } public function destruct() { $fn=null; $ss=null; } }
8、如果出現(xiàn)簽名失敗的錯(cuò)誤,我們可以使用微信的支付接口調(diào)試工具來(lái)進(jìn)行測(cè)試:pay.weixin.qq.com/wiki/tools/signverify/。
這個(gè)工具是雖然是用于驗(yàn)證“被掃支付”的,但通過(guò)它的“增加參數(shù)”按鈕和“刪除參數(shù)”按鈕,我們也可以用它來(lái)測(cè)試“公眾號(hào)支付”。例如,如果你提交的xml內(nèi)容如下(可利用Log函數(shù)保存提交的xml內(nèi)容到sae storage,然后下載日志文件):
1 6666833333
則你可以中測(cè)試工具中這樣填寫表單:
點(diǎn)擊“生成簽名”。將得到的簽名和日志文件中的簽名進(jìn)行比較,看是否一致,即可排除簽名算法的問(wèn)題。
如果2個(gè)簽名一致,則可以肯定是支付key的問(wèn)題。要么是產(chǎn)品MM搞錯(cuò)了,要么是AppSecret和支付key搞反了(有一次產(chǎn)品MM告訴了為一個(gè)錯(cuò)誤的支付key,浪費(fèi)了我3天的時(shí)間!我反復(fù)確認(rèn)了每一處代碼、每一次后臺(tái)參數(shù)設(shè)置之后,最終用“支付接口調(diào)試工具”確認(rèn)簽名無(wú)誤,問(wèn)題就出在支付key上。于是登入商戶平臺(tái),因?yàn)椴皇枪芾韱T,又跟產(chǎn)品MM要了手機(jī)驗(yàn)證碼,重新設(shè)置了支付key,代碼一下就通了)
感謝各位的閱讀!關(guān)于“微信開(kāi)發(fā)中如何實(shí)現(xiàn)微信支付”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!