前幾日剛剛做完微信公眾號JS支付,以下是在做微信支付時遇到的一些小問題,以備后用,這里使用PHP
一、關於在公眾平台設置的參數
1、微信支付--開發配置:支付授權目錄,測試授權目錄,測試白名單,(掃碼支付回調URL當時也設置了,可以先不設置,回來再看)
2、公眾號設置--功能設置:JS接口安全域名,填寫例如baidu.com的形式
3、接口權限:網頁賬號(網頁授權獲取用戶基本信息),點擊修改,填寫回調域名,例如www.baidu.com形式。該域名需要通過ICP備案
二、需要的一些配置參數
1、公眾號應用ID:APPID (在“公眾平台--基本配置”中查看)
2、商戶號ID:MCHID (在“公眾平台--微信支付”中查看,注意一些商戶號后面有“服務商”三個字代表是服務商商戶號,服務商需要子商戶號;無“服務商”的不需要子商戶號)
3、應用密鑰:APPSECRET (在“公眾平台--基本配置”中查看)
4、支付安全密鑰:KEY (在“商戶平台--API安全”中設置“API密鑰”,可能需要下載安全證書)
5、下載證書 (在“商戶平台--API安全”中下載API證書)
三、開發階段步驟
1、下載官方demo,地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1
2、將cert下的兩個證書替換為自己的
3、將lib/WxPay.Config.php中的APPID,MCHID,KEY,APPSECRET設置為自己的
4、example/jsapi.php中的“$input->SetNotify_url(...)”改為自己的
------------------此時再修改index.php中的地址,即可進行一次0.01元測試-----------------
5、做自己測試階段可以將“lib/Wxpay.Data.php”中的MakeSign方法在步驟二和步驟四下面進行輸出,可以查看生成的簽名是否正確
public function MakeSign() { //簽名步驟一:按字典序排序參數 ksort($this->values); $string = $this->ToUrlParams(); //簽名步驟二:在string后加入KEY $string = $string . "&key=".WxPayConfig::KEY; print_r("string:".$string."<br />"); //輸出生成的字符串 //簽名步驟三:MD5加密 $string = md5($string); //簽名步驟四:所有字符轉為大寫 $result = strtoupper($string); print_r("MakeSign:".$result); //輸出生成的簽名 return $result; }
如果有問題,可以在https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=20_1中檢查簽名,如果簽名有錯誤則證明字段有誤,簽名與自己的簽名一致則可能是前面參數本身設置有問題
6、關於向jsapi.php傳參的問題:
由於微信支付本身需要在只有在微信瀏覽器中打開的網頁才能起作用,即jsapi.php中$openId = $tools->GetOpenid();此行代碼進行了一個頁面跳轉,造成了傳來的一些例如商品描述,金額等關鍵信息丟失。
①jsapi.php需要在GetOpenid()之前對發來的信息進行收集,所做項目的此處代碼:
1 //獲取post來的數據 2 $body = $_POST['body']; 3 $address = $_POST['address']; 4 $total_fee = $_POST['total_fee']*100; 5 $id = $_POST['id']; 6 7 //①、獲取用戶openid 8 $tools = new JsApiPay(); 9 $openId = $tools->GetOpenid($body,$address,$total_fee,$id);
②修改WxPay.JsApiPay.php中的GetOpenId()方法,將傳遞來的參數通過state參數進行傳遞,此處代碼
1 public function GetOpenid($body,$address,$total_fee,$id) 2 { 3 //通過code獲得openid 4 if (!isset($_GET['code'])){ 5 //觸發微信返回code碼 6 $baseUrl = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING']); 7 $url = $this->__CreateOauthUrlForCode($baseUrl); 8 //將用戶傳來的參數使用STATE參數進行傳遞 9 $state = json_encode(array( 10 "body" => $body, 11 "address" => $address, 12 "total_fee" => "$total_fee", 13 "id" => $id 14 )); 15 $url = str_replace("STATE", $state, $url); 16 Header("Location: $url"); 17 exit(); 18 }else { 19 //獲取code碼,以獲取openid 20 $code = $_GET['code']; 21 $openid = $this->getOpenidFromMp($code); 22 return $openid; 23 } 24 }
③在jsapi.php中的GetOpenId()后面對關鍵信息進行提取,此處代碼
1 //獲取傳遞的用戶參數 2 $info = $_GET['state']; 3 $info = json_decode($info); 4 5 $body = $info ->body; 6 $address = $info ->address; 7 $total_fee = $info ->total_fee; 8 $id = $info ->id;
之后再進行統一下單即可
7、支付成功后的回調方法
在jsapi.php中的jsApiCall()方法中修改,相關代碼如下
1 function jsApiCall() 2 { 3 WeixinJSBridge.invoke( 4 'getBrandWCPayRequest', 5 <?php echo $jsApiParameters; ?>, 6 function(res){ 7 if (res.err_msg == "get_brand_wcpay_request:ok"){ 8 // message: "微信支付成功!" 9 //微信支付成功的回調方法 10 11 }else if (res.err_msg == "get_brand_wcpay_request:cancel") { 12 // message: "已取消微信支付!" 13 //取消支付的回調方法 14 alert('您已取消支付!'); 15 window.history.go(-1); 16 } 17 } 18 ); 19 }
以上。