摘要:開發流程準備完成后我們來看一下支付的大體流程商戶應用與微信支付主要的交互說明用戶在商戶應用移動端中選擇商品提交訂單,支付方式選擇微信支付。商戶應用后臺收到用戶支付訂單,調用微信支付中的統一下單接口。
引言
秋高氣爽,天氣轉涼,正是學習工作做的好時候。(~ ̄▽ ̄)~~(~ ̄▽ ̄)~
我是個phper最近在寫微信支付(APP支付),微信給的官方文檔并不是很詳細也沒有dome之類的代碼啥的(對于新手來說比較麻煩),本人是新手以前也沒寫過支付,踩了好多坑,所以想寫篇文章給沒寫過支付的新手幾個建議。
準備工作這首先呢你得注冊個開放平臺以及商戶平臺的賬號吧,注冊完成后呢你會收到一封微信里郵件里面有你的商戶號等信息,注冊這倆賬號完你會擁有商戶號,appid,appkey等需要的東西。
開發流程準備完成后我們來看一下支付的大體流程
商戶APP應用與微信支付主要的交互說明:
用戶在商戶APP應用(移動端)中選擇商品提交訂單,支付方式選擇微信支付。
商戶APP應用(后臺)收到用戶支付訂單,調用微信支付中的統一下單接口。
商戶APP應用(后臺)統一下單接口調用成功后,返回的數據中有我們需要的prepay_id,按照簽名規范重新生成一個簽名,然后把這個重新生成的簽名及app需要的數據返回給商戶APP應用(移動端)。
商戶APP應用(移動端)收到商戶APP應用(后臺)的數據調起微信支付,用戶進行支付
商戶APP應用(后臺)的回調接口會收到微信發來的支付結果通知
商戶APP應用(后臺)查詢支付結果通知
附:1,4是移動端所要做的事情,2,3,5是我們PHP服務端后臺要做的6也是,但我沒做,這個根據情況而定如果需要的話就做。
開始干活步驟1由移動端完成
步驟2. 調用同一下單接口:
先要做的是流程中的第二步,調用同一下單接口。官方文檔里說了請求的地址與參數,其中有一些是必填參數,有
appid
應用ID 固定值,你申請賬號時就給你了
mch_id
商戶號 固定值,你申請賬號時就給你了
nonce_str
隨機字符串 這個是自己寫的要求不能長于32位,參見官方給的[標準][8]
sign
簽名 我們把這個簽名叫做第一次簽名,注意這個是個坑,得自己寫了,官方只給了如何寫的[標準][9]沒有代碼,這個就比較蛋疼了。好多人掉進這個坑里,寫的簽名函數不對,老是出錯。但不用擔心我在文章的最后會貼出代碼里面有簽名函數直接調用就可以了。(注意看我寫的函數使用規則)
body
商品描述 固定值 商品描述交易字段格式根據不同的應用場景按照以下格式:APP——需傳入應用市場上的APP名字-實際商品名稱,天天愛消除-游戲充值。
out_trade_no
商戶訂單號 我們自己定義的訂單號,32個字符內、可包含字母。
total_fee
總金額 這個就是你要支付的錢數了,由前端返回。注意一下這里的貨幣單位是分!
spbill_create_ip
終端IP 這個用戶的IP地址,寫個取IP地址的函數一調用就行
notify_url
通知地址 這又是一個坑,好多人不理解是干嘛的,這是接收微信支付異步通知回調地址用的,通知url必須為直接可訪問的url,不能攜帶參數! 也可以這樣理解,這個是給微信支付的接口,微信來調用的接口,微信調這接口干嘛用呢?就是告訴你用戶付款成功啦或者用戶付款失敗了,然后你就可以在這個接口里通過微信給你返回的信息來做邏輯處理了。
trade_type
固定值 寫 “APP” 因為咱寫的是APP支付嘛,所以就填APP。
好了就是這些必選參數了,剩下就可以自己選擇是否要用的參數了根據自己情況而定。
參數選完了就要發送參數了唄,如何發呢?
我們來調用wechatAppPay類中的unifiedOrder()函數。
啊哈啥!!!!!!??????
(⊙o⊙)?(⊙o⊙)?(⊙o⊙)?(⊙o⊙)?(⊙o⊙)?
wechatAppPay類???unifiedOrder()函數???
對就這這倆東西,不要驚訝,不要著急看最后有代碼,有這個類,有代碼的O(∩_∩)O哈哈~,
你只需在你的項目中加載這個類就可以調用這個方法了!不要崇拜我( ╯▽╰)(因為這個類不是我寫的我也忘了從哪找的了,我從百度搜的然后整理的做了些改動╮(╯▽╰)╭ -_-|||-_-|||-_-!好吧好吧好吧沒做改動,只是加了點注釋而已,感謝寫這個類的大神謝謝O(∩_∩)O謝謝O(∩_∩)O謝謝)
好了抽完瘋了,開是干正事!
我們先來new下wechatAppPay類
$wxappid = "wx0000000000000";//應用ID 字符串 $mch_id = "1000000000";//商戶號 字符串 $notify_url = "http://www.xxx.com/xxxx.php/xxxx/xxxx";//接收微信支付異步通知回調地址 字符串 $wxkey = "00000000000000000000000";//這個是在商戶中心設置的那個值用來生成簽名時保證安全的 字符串 $this->wechatAppPay = new wechatAppPay($wxappid, $mch_id, $notify_url, $wxkey);
調用wechatAppPay類中的unifiedOrder()函數。unifiedOrder()需要的參數是個數組我們定義為$params
$params = array(); $params["body"] = "APP-在線支付"; //必填項 商品描述 $params["out_trade_no"] = time()."$member"; //必填項 自定義的訂單號 $params["total_fee"] = ($money*100); //必填項 訂單金額 單位為分所以要*100 $params["trade_type"] = "APP"; //必填項 交易類型固定寫 APP $params["根據自己情況定的值"] = "根據自己情況定的值" //非必填項 根據自己情況定的值 這個可有好多個可以參看開發文檔中的參數 $result = $this->wechatAppPay->unifiedOrder( $params );
注:如果你加了$params["根據自己情況定的值"] wechatAppPay類里要做相應的改動,文章的最后有代碼,你一看代碼就明白了
現在$result就是我們調用統一下單接口返回的數據了,這個$resutl通過unifiedOrder()函數的處理已經把xml格式變成數組了。$result 里有return_code,return_msg,appid,mch_id,nonce_str,sign,result_code,prepay_id,trade_type。這里面就用一個prepay_id(預支付交易會話ID),其他都不重要了
步驟2完畢
步驟3 把數據返回給商戶APP應用(移動端)調起支付接口
現在我們要把調用統一下單接口返回的數據$resutl里的幾個值返回給移動端
那幾個值呢?這幾個:
appid
應用ID 這個是固定的 可以自己寫也可以從$resutl里拿 可以讓移動端寫死 就不用每次返回了
partnerid
商戶號 這個也是固定的 可以自己寫也可以從$resutl里拿 可以讓移動端寫死 就不用每次返回了
prepayid
預支付交易會話ID 這個很重要必須返回給移動端 是必須從$resutl里拿的
package
擴展字段 可以自己寫也可以從$resutl里拿 暫填寫固定值"Sign=WXPay" 可以讓移動端寫死 就不用每次返回了
noncestr
隨機字符串 這個可以自己寫也可以從$resutl里拿
timestamp
時間戳 自己生成 標準北京時間,時區為東八區注意:部分系統取到的值為毫秒級,需要轉換成秒(10位數字),這里有個坑,ISO端接收的時候好像得強行轉化一下,因為返回的是字符串不是數字,還有什么幾位的數字之類的,我也不太懂,反正就是寫的時候提醒下iOS工程師就行。安卓不清楚。
sign
簽名 又來一個坑,我們把這個簽名叫做二次簽名,但是這個簽名不是從$resutl里拿的,而是自己寫的,如何寫呢,又有坑!因為參與簽名的參數值是那幾個不清楚,參數名寫不對!不怕我有代碼!貼給你看!需要參與簽名的值有六個! $sign_array = array(); $sign_array["appid"] = $wx_result["appid"]; //注意 $sign_array["appid"] 里的參數名必須是appid $sign_array["partnerid"] = $wx_result["mch_id"]; //注意 $sign_array["partnerid"] 里的參數名必須是partnerid $sign_array["prepayid"] = $wx_result["prepay_id"];//注意 $sign_array["prepayid"] 里的參數名必須是prepayid $sign_array["package"] = "Sign=WXPay"; //注意 $sign_array["package"] 里的參數名必須是package $sign_array["noncestr"] = $wx_result["nonce_str"];//注意 $sign_array["noncestr"] 里的參數名必須是noncestr $sign_array["timestamp"] = time(); //注意 $sign_array["timestamp"] 里的參數名必須是timestamp $sign_two = $this->wechatAppPay->MakeSign($sign_array);//調用wechatAppPay類里的MakeSign()函數生成sign
現在就可以把重新生成的sign($sign_two)以及其他參數返回給移動端了,一共返回七個值,有三個之可以讓前端寫死(appid,partnerid,package),其余四個必須由服務器返回給移動端。
步驟3完畢
步驟4由移動端完成
步驟5 回調接口 支付結果通用通知
還記得步驟2中我們設置的$notify_url嗎,對現在就要對這個微信返回到這個接口的數據進行一系列的邏輯處理了
官方是這樣寫的:
支付完成后,微信會把相關支付結果和用戶信息發送給商戶,商戶需要接收處理,并返回應答。 對后臺通知交互時,如果微信收到商戶的應答不是成功或超時,微信認為通知失敗,微信會通過一定的策略定期重新發起通知,盡可能提高通知的成功率,但微信不保證通知最終能成功。 (通知頻率為15/15/30/180/1800/1800/1800/1800/3600,單位:秒) 注意:同樣的通知可能會多次發送給商戶系統。商戶系統必須能夠正確處理重復的通知。 推薦的做法是,當收到通知進行處理時,首先檢查對應業務數據的狀態,判斷該通知是否已經處理過,如果沒有處理過再進行處理,如果處理過直接返回結果成功。在對業務數據進行狀態檢查和處理之前,要采用數據鎖進行并發控制,以避免函數重入造成的數據混亂。 特別提醒:商戶系統對于支付結果通知的內容一定要做簽名驗證,防止數據泄漏導致出現“假通知”,造成資金損失。
首先來接收數據
$data = $this->wechatAppPay->getNotifyData();//獲取數據 用wechatAppPay類里的getNotifyData()方法,這里數據也被getNotifyData()由xml轉化成了數組。
然后官方說要采用數據鎖進行并發控制,這個我不懂所以沒寫(如果你懂你會的話請給我留言私信告訴我,在這謝謝了),對數據進行狀態檢查這個寫了,如何寫的呢?很簡單微信返回的值有好多其中就可以判斷result_code(業務結果)和return_code(返回狀態碼)是否為SUCCESS就可以了代碼就不寫了。
然后驗簽,這個很重要因為這是保證數據沒有被第三方人為篡改的標準!
如何驗簽呢?
把返回的數據$data里除去sign剩下的值都參與重新簽名我們把這次簽名叫做驗簽簽名,驗簽簽名生成后再與$data里的sign對比,如果相同驗簽通過,否則不通過。這次簽名的參數名與二次簽名時的參數名不同,$data數組里叫什么參數名就驗簽時叫什么參數名。聽亂了吧?(~ ̄▽ ̄)~(~ ̄▽ ̄)~沒關系請看代碼
//假如$data里有如下參數 $w_sign = array(); //參加驗簽簽名的參數數組 $w_sign["appid"] = $data["appid"]; $w_sign["bank_type"] = $data["bank_type"]; $w_sign["cash_fee"] = $data["cash_fee"]; $w_sign["fee_type"] = $data["fee_type"]; $w_sign["is_subscribe"] = $data["is_subscribe"]; $w_sign["mch_id"] = $data["mch_id"]; $w_sign["nonce_str"] = $data["nonce_str"]; $w_sign["openid"] = $data["openid"]; $w_sign["out_trade_no"] = $data["out_trade_no"]; $w_sign["result_code"] = $data["result_code"]; $w_sign["return_code"] = $data["return_code"]; $w_sign["time_end"] = $data["time_end"]; $w_sign["total_fee"] = $data["total_fee"]; $w_sign["trade_type"] = $data["trade_type"]; $w_sign["transaction_id"] = $data["transaction_id"]; $verify_sign = $this->wechatAppPay->MakeSign($w_sign);//生成驗簽簽名
好了現在假設你的驗簽已經通過了接下里就是你自己的邏輯處理了
/////////////////////////////////////////////////////// 商戶APP應用(后臺)處理邏輯代碼 //////////////////////////////////////////////////////
自己的邏輯處理已經處理完之后,還得告訴微信一下,別再一直發結果通用通知啦,我已經收到通知并處理完啦!
$this->wechatAppPay->replyNotify();//商戶處理后同步返回給微信參數
步驟5結束
步驟6根據自己情況而定
至此微信支付處理完成~(≧▽≦)/~啦啦啦~(≧▽≦)/~啦啦啦~(≧▽≦)/~啦啦啦~(≧▽≦)/~啦啦啦
寫的有不對的方還請大家多多指導指教!!!給我留言!!b( ̄▽ ̄)db( ̄▽ ̄)db( ̄▽ ̄)d
交流學習:QQ群 634574190 (請認真看完文章再加(¬_¬)(¬_¬)(¬_¬))
還有感謝在我寫微信支付地時候 那些被我問煩了的大神們! !謝謝啦~(≧▽≦)/~啦啦啦~(≧▽≦)/~啦啦啦~(≧▽≦)/~啦啦啦O(∩_∩)O哈哈~O(∩_∩)O哈哈~O(∩_∩)O哈哈~<( ̄︶ ̄)><( ̄︶ ̄)><( ̄︶ ̄)>
代碼wechatAppPay類
class wechatAppPay { //接口API URL前綴 const API_URL_PREFIX = "https://api.mch.weixin.qq.com"; //下單地址URL const UNIFIEDORDER_URL = "/pay/unifiedorder"; //查詢訂單URL const ORDERQUERY_URL = "/pay/orderquery"; //關閉訂單URL const CLOSEORDER_URL = "/pay/closeorder"; //公眾賬號ID private $wxappid; //商戶號 private $mch_id; //隨機字符串 private $nonce_str; //簽名 private $sign; //商品描述 private $body; //商戶訂單號 private $out_trade_no; //支付總金額 private $total_fee; //終端IP private $spbill_create_ip; //支付結果回調通知地址 private $notify_url; //交易類型 private $trade_type; //支付密鑰 private $key; //證書路徑 private $SSLCERT_PATH; private $SSLKEY_PATH; //所有參數 private $params = array(); public function __construct($wxappid, $mch_id, $notify_url, $key) { $this->appid = $wxappid; $this->mch_id = $mch_id; $this->notify_url = $notify_url; $this->key = $key; } /** * 下單方法 * @param $params 下單參數 */ public function unifiedOrder( $params ){ $this->body = $params["body"]; $this->out_trade_no = $params["out_trade_no"]; $this->total_fee = $params["total_fee"]; $this->trade_type = $params["trade_type"]; $this->nonce_str = $this->genRandomString(); $this->spbill_create_ip = $_SERVER["REMOTE_ADDR"]; $this->params["appid"] = $this->appid; $this->params["mch_id"] = $this->mch_id; $this->params["nonce_str"] = $this->nonce_str; $this->params["body"] = $this->body; $this->params["out_trade_no"] = $this->out_trade_no; $this->params["total_fee"] = $this->total_fee; $this->params["spbill_create_ip"] = $this->spbill_create_ip; $this->params["notify_url"] = $this->notify_url; $this->params["trade_type"] = $this->trade_type; //獲取簽名數據 $this->sign = $this->MakeSign( $this->params ); $this->params["sign"] = $this->sign; $xml = $this->data_to_xml($this->params); $response = $this->postXmlCurl($xml, self::API_URL_PREFIX.self::UNIFIEDORDER_URL); if( !$response ){ return false; } $result = $this->xml_to_data( $response ); if( !empty($result["result_code"]) && !empty($result["err_code"]) ){ $result["err_msg"] = $this->error_code( $result["err_code"] ); } return $result; } /** * 查詢訂單信息 * @param $out_trade_no 訂單號 * @return array */ public function orderQuery( $out_trade_no ){ $this->params["appid"] = $this->appid; $this->params["mch_id"] = $this->mch_id; $this->params["nonce_str"] = $this->genRandomString(); $this->params["out_trade_no"] = $out_trade_no; //獲取簽名數據 $this->sign = $this->MakeSign( $this->params ); $this->params["sign"] = $this->sign; $xml = $this->data_to_xml($this->params); $response = $this->postXmlCurl($xml, self::API_URL_PREFIX.self::ORDERQUERY_URL); if( !$response ){ return false; } $result = $this->xml_to_data( $response ); if( !empty($result["result_code"]) && !empty($result["err_code"]) ){ $result["err_msg"] = $this->error_code( $result["err_code"] ); } return $result; } /** * 關閉訂單 * @param $out_trade_no 訂單號 * @return array */ public function closeOrder( $out_trade_no ){ $this->params["appid"] = $this->appid; $this->params["mch_id"] = $this->mch_id; $this->params["nonce_str"] = $this->genRandomString(); $this->params["out_trade_no"] = $out_trade_no; //獲取簽名數據 $this->sign = $this->MakeSign( $this->params ); $this->params["sign"] = $this->sign; $xml = $this->data_to_xml($this->params); $response = $this->postXmlCurl($xml, self::API_URL_PREFIX.self::CLOSEORDER_URL); if( !$response ){ return false; } $result = $this->xml_to_data( $response ); return $result; } /** * * 獲取支付結果通知數據 * return array */ public function getNotifyData(){ //獲取通知的數據 $xml = $GLOBALS["HTTP_RAW_POST_DATA"]; $data = array(); if( empty($xml) ){ return false; } $data = $this->xml_to_data( $xml ); if( !empty($data["return_code"]) ){ if( $data["return_code"] == "FAIL" ){ return false; } } return $data; } /** * 接收通知成功后應答輸出XML數據 * @param string $xml */ public function replyNotify(){ $data["return_code"] = "SUCCESS"; $data["return_msg"] = "OK"; $xml = $this->data_to_xml( $data ); echo $xml; die(); } /** * 生成APP端支付參數 * @param $prepayid 預支付id */ public function getAppPayParams( $prepayid ){ $data["appid"] = $this->appid; $data["partnerid"] = $this->mch_id; $data["prepayid"] = $prepayid; $data["package"] = "Sign=WXPay"; $data["noncestr"] = $this->genRandomString(); $data["timestamp"] = time(); $data["sign"] = $this->MakeSign( $data ); return $data; } /** * 生成簽名 * @return 簽名 */ public function MakeSign( $params ){ //簽名步驟一:按字典序排序數組參數 ksort($params); $string = $this->ToUrlParams($params); //簽名步驟二:在string后加入KEY $string = $string . "&key=".$this->key; //簽名步驟三:MD5加密 $string = md5($string); //簽名步驟四:所有字符轉為大寫 $result = strtoupper($string); return $result; } /** * 將參數拼接為url: key=value&key=value * @param $params * @return string */ public function ToUrlParams( $params ){ $string = ""; if( !empty($params) ){ $array = array(); foreach( $params as $key => $value ){ $array[] = $key."=".$value; } $string = implode("&",$array); } return $string; } /** * 輸出xml字符 * @param $params 參數名稱 * return string 返回組裝的xml **/ public function data_to_xml( $params ){ if(!is_array($params)|| count($params) <= 0) { return false; } $xml = "都看到這里了,給順手點個贊唄!(~ ̄▽ ̄)~<( ̄︶ ̄)>"; foreach ($params as $key=>$val) { if (is_numeric($val)){ $xml.="<".$key.">".$val."".$key.">"; }else{ $xml.="<".$key.">".$key.">"; } } $xml.=" "; return $xml; } /** * 將xml轉為array * @param string $xml * return array */ public function xml_to_data($xml){ if(!$xml){ return false; } //將XML轉為array //禁止引用外部xml實體 libxml_disable_entity_loader(true); $data = json_decode(json_encode(simplexml_load_string($xml, "SimpleXMLElement", LIBXML_NOCDATA)), true); return $data; } /** * 獲取毫秒級別的時間戳 */ private static function getMillisecond(){ //獲取毫秒的時間戳 $time = explode ( " ", microtime () ); $time = $time[1] . ($time[0] * 1000); $time2 = explode( ".", $time ); $time = $time2[0]; return $time; } /** * 產生一個指定長度的隨機字符串,并返回給用戶 * @param type $len 產生字符串的長度 * @return string 隨機字符串 */ private function genRandomString($len = 32) { $chars = array( "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" ); $charsLen = count($chars) - 1; // 將數組打亂 shuffle($chars); $output = ""; for ($i = 0; $i < $len; $i++) { $output .= $chars[mt_rand(0, $charsLen)]; } return $output; } /** * 以post方式提交xml到對應的接口url * * @param string $xml 需要post的xml數據 * @param string $url url * @param bool $useCert 是否需要證書,默認不需要 * @param int $second url執行超時時間,默認30s * @throws WxPayException */ private function postXmlCurl($xml, $url, $useCert = false, $second = 30){ $ch = curl_init(); //設置超時 curl_setopt($ch, CURLOPT_TIMEOUT, $second); curl_setopt($ch,CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2); //設置header curl_setopt($ch, CURLOPT_HEADER, FALSE); //要求結果為字符串且輸出到屏幕上 curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); if($useCert == true){ //設置證書 //使用證書:cert 與 key 分別屬于兩個.pem文件 curl_setopt($ch,CURLOPT_SSLCERTTYPE,"PEM"); //curl_setopt($ch,CURLOPT_SSLCERT, WxPayConfig::SSLCERT_PATH); curl_setopt($ch,CURLOPT_SSLKEYTYPE,"PEM"); //curl_setopt($ch,CURLOPT_SSLKEY, WxPayConfig::SSLKEY_PATH); } //post提交方式 curl_setopt($ch, CURLOPT_POST, TRUE); curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); //運行curl $data = curl_exec($ch); //返回結果 if($data){ curl_close($ch); return $data; } else { $error = curl_errno($ch); curl_close($ch); return false; } } /** * 錯誤代碼 * @param $code 服務器輸出的錯誤代碼 * return string */ public function error_code( $code ){ $errList = array( "NOAUTH" => "商戶未開通此接口權限", "NOTENOUGH" => "用戶帳號余額不足", "ORDERNOTEXIST" => "訂單號不存在", "ORDERPAID" => "商戶訂單已支付,無需重復操作", "ORDERCLOSED" => "當前訂單已關閉,無法支付", "SYSTEMERROR" => "系統錯誤!系統超時", "APPID_NOT_EXIST" => "參數中缺少APPID", "MCHID_NOT_EXIST" => "參數中缺少MCHID", "APPID_MCHID_NOT_MATCH" => "appid和mch_id不匹配", "LACK_PARAMS" => "缺少必要的請求參數", "OUT_TRADE_NO_USED" => "同一筆交易不能多次提交", "SIGNERROR" => "參數簽名結果不正確", "XML_FORMAT_ERROR" => "XML格式錯誤", "REQUIRE_POST_METHOD" => "未使用post傳遞參數 ", "POST_DATA_EMPTY" => "post數據不能為空", "NOT_UTF8" => "未使用指定編碼格式", ); if( array_key_exists( $code , $errList ) ){ return $errList[$code]; } } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30452.html
摘要:開發流程準備完成后我們來看一下支付的大體流程商戶應用與微信支付主要的交互說明用戶在商戶應用移動端中選擇商品提交訂單,支付方式選擇微信支付。商戶應用后臺收到用戶支付訂單,調用微信支付中的統一下單接口。 引言 秋高氣爽,天氣轉涼,正是學習工作做的好時候。(~ ̄▽ ̄)~~(~ ̄▽ ̄)~ 我是個phper最近在寫微信支付(APP支付),微信給的官方文檔并不是很詳細也沒有dome之類的代碼啥的(...
摘要:這個坑就是要注意回調結束要返回成功的響應這幾天做微信支付暫時遇到的問題就這么多,只能說注意細節吧,爬過的坑記錄下來以后遇到就懂處理了。 前言 其實任何接口開發只要按照給出來的接口文檔和例子開發基本上不會有太大問題的,一些問題都是出在雜七雜八的小細節上,現在分享一下微信支付開發中自己遇到的小細節。按照文檔做完開發前配置,比如JS安全域名配置、網頁授權域名、公眾號授權目錄等等... 坑一:...
摘要:微信說明文檔分享的坑根據的文檔,很多人都是在初始化的配置的時候,傳入的當前的地址不正確。同樣的,給微信初始化的加入對應的參數。 date: 2018-12-13 15:23:09 用于記錄接入微信JS-SDK的坑,以后方便查詢第一次接入公眾號微信支付、分享、定位等等的坑的時候,心里是迷茫而又恐懼。因為,聽說坑特別多,后來發現自己的親身體驗到了這一點。 支付的坑 1、當前URL未注冊 ...
摘要:微信說明文檔分享的坑根據的文檔,很多人都是在初始化的配置的時候,傳入的當前的地址不正確。同樣的,給微信初始化的加入對應的參數。 date: 2018-12-13 15:23:09 用于記錄接入微信JS-SDK的坑,以后方便查詢第一次接入公眾號微信支付、分享、定位等等的坑的時候,心里是迷茫而又恐懼。因為,聽說坑特別多,后來發現自己的親身體驗到了這一點。 支付的坑 1、當前URL未注冊 ...
閱讀 3274·2021-11-23 09:51
閱讀 939·2021-09-03 10:30
閱讀 3212·2021-08-31 09:40
閱讀 3278·2019-08-30 14:22
閱讀 902·2019-08-30 14:09
閱讀 2900·2019-08-30 13:21
閱讀 3232·2019-08-28 18:03
閱讀 2859·2019-08-26 13:44