關於微店整合微信支付時出現的的各種問題的記錄 php版
由於公司專案的需要,需要在專案裡整合微信支付,公司原有的專案中已有老版本的支付功能,在此不作討論。我需要作的就是加入新版本的支付功能
讓專案裡可以支援新老兩種版本的功能。在微信官方下載到了新版支付的php版sdk,看到 WxPay.ub.config.php,SDKRuntimeException.php, WxPayPubHelper.php
三個檔案。我需要改造的就是WxPayPubHelper.php這個檔案,因為這個檔案現在是單使用者配置的,所以我要讓它變成多使用者的,在改造的過程中遇到了幾點問題,也是大家
可能會經常遇到的,在這分享出來,希望能給他人一些幫助。
q1:redirect_uri 引數錯誤的問題 !
這個問題出現的比例比較大,在sdk包裡有一個demo的資料夾,裡面有一個js_api_call.php檔案,在他的13行裡有如下程式碼:
//使用jsapi介面 $jsApi = new JsApi_pub(); //=========步驟1:網頁授權獲取使用者openid============ //通過code獲得openid if (!isset($_GET['code'])) { //觸發微信返回code碼 $url = $jsApi->createOauthUrlForCode(WxPayConf_pub::JS_API_CALL_URL); Header("Location: $url"); }else { //獲取code碼,以獲取openid $code = $_GET['code']; $jsApi->setCode($code); $openid = $jsApi->getOpenId(); }
$url = $jsApi->createOauthUrlForCode(WxPayConf_pub::JS_API_CALL_URL);
這一句就是設定redirect_uri引數的地方,我把它改造成了自己的地址,程式碼如下:
$url = $jsApi->createOauthUrlForCode( $site_domain.base64_decode($_GET['uri']));
為什麼要用base64編碼呢,因為我的url是像這樣的 :
index.php?g=Wap&m=Wxpay&a=newpay&token=$1&wecha_id=$2&orderid=$3
這個url又臭又長,而且很多&符,無法識別出哪部分是自己的url了,還有最重要的部分 WxPayHubHelper.php在大概822行的部分,有一個方法叫createOauthUrlForCode($redirectUrl),這個裡面的$url這個變數沒有進行url編碼,請自己加一下,否則你的url裡有引數將不能正常被識別,程式碼很簡單:
$url = urlencode($redirectUrl); 這樣就行。
進行了以上的設定後如果還出現redirect_uri的錯誤的話就要考慮你的支付路徑許可權的問題了,進入微信公眾號的後臺,請確保你的是服務號,並且已認證,檢視方法是頁面右上角。在確認了之後 點左側選單的 “開發者中心”,然後如圖:
點選修改,填入“授權回撥頁面域名”,請確保這個域名和你的應用域名一致,這樣應該就解決了這個問題。
q2:無法獲取prepay_id的問題
首選請確保你 WxPayPubHelper.php這個檔案裡 UnifiedOrder_pub 這個類的getPrepayId這個方法能正常使用。
此方法程式碼如下:
/**
* 獲取prepay_id
*/
function getPrepayId()
{
$this->postXml();
$this->result = $this->xmlToArray($this->response);
$prepay_id = $this->result["prepay_id"];
return $prepay_id;
}
檢視posXml這個方法後發現呼叫了自己的createXml這個方法
postXml方法如下:
/**
* 作用:post請求xml
*/
function postXml()
{
$xml = $this->createXml();
$this->response = $this->postXmlCurl($xml,$this->url,$this->curl_timeout);
return $this->response;
}
這時需要確認你的$xml這個變數形式如下:
<xml><openid><![CDATA[o-aubjtEkotIj_GNXXXXqV8_XXXXX]]></openid>
<body>201501201705551389</body>
<out_trade_no><![CDATA[wx7143c4a87a86c8ac142174XXX]]></out_trade_no>
<total_fee>1</total_fee>
<notify_url><![CDATA[http://demo.com/paydemo/demo/notify_url.php]]></notify_url>
<trade_type><![CDATA[JSAPI]]></trade_type>
<appid><![CDATA[wx7143c4axxxxxxxx]]></appid>
<mch_id>10020230</mch_id>
<spbill_create_ip><![CDATA[192.168.1.110]]></spbill_create_ip>
<nonce_str><![CDATA[imfgrg1g2odbl6mbiacmlkxxxxxxx]]></nonce_str>
<sign><![CDATA[CBE62F36806A3E1D98CB2311XXXXXX]]></sign></xml>
尤其注意 openid的形式一定要類似這樣的,全是數字或全是字母的一定是錯誤
然後postXmlCurl才能正確提交,提交後就能得到正確的prepay_id了
q3:在取到了prepay_id後,在進行付款的時候提示:公眾號支付使用了無效的商戶號
這個問題大部分是出現在二次簽名的時候,由於第二次簽名和第一次簽名不一致導致的
這時我們需要看WxPayPubHelper.php這個檔案裡的JsApi_pub這個類,這個類中的getParameters這個方法是進行第二次簽名的關鍵,程式碼如下:
/**
* 作用:設定jsapi的引數
*/
public function getParameters()
{
$jsApiObj["appId"] = WxPayConf_pub::APPID;
$timeStamp = time();
$jsApiObj["timeStamp"] = "$timeStamp";
$jsApiObj["nonceStr"] = $this->createNoncestr();
$jsApiObj["package"] = "prepay_id=$this->prepay_id";
$jsApiObj["signType"] = "MD5";
$jsApiObj["paySign"] = $this->getSign($jsApiObj);
$this->parameters = json_encode($jsApiObj);
return $this->parameters;
}
由於我需要根據資料表裡的設定來動態的呼叫key,所以我的這個簽名要符合多個商家的,程式碼改動如下:
/**
* 作用:設定jsapi的引數
*/
public function getParameters()
{
$jsApiObj["appId"] = $this->config['appid'];
$timeStamp = time();
$jsApiObj["timeStamp"] = "$timeStamp";
$jsApiObj["nonceStr"] = $this->createNoncestr();
$jsApiObj["package"] = "prepay_id=$this->prepay_id";
$jsApiObj["signType"] = "MD5";
$jsApiObj["paySign"] = $this->getSign($jsApiObj, $this->config['key']);
$this->parameters = json_encode($jsApiObj);
return $this->parameters;
}
getSign這個方法原型不帖了,改動後如下:
/**
* 作用:生成簽名
*/
public function getSign($Obj, $key ='')
{
foreach ($Obj as $k => $v)
{
$Parameters[$k] = $v;
}
//簽名步驟一:按字典序排序引數
ksort($Parameters);
$String = $this->formatBizQueryParaMap($Parameters, false);
//echo '【string1】'.$String.'</br>';
//簽名步驟二:在string後加入KEY
if ($key!='') {
$String = $String."&key=".$key;
}else{
$String = $String."&key=".WxPayConf_pub::KEY;
}
//echo "【string2】".$String."</br>";
//簽名步驟三:MD5加密
$String = md5($String);
//echo "【string3】 ".$String."</br>";
//簽名步驟四:所有字元轉為大寫
$result_ = strtoupper($String);
//echo "【result】 ".$result_."</br>";
return $result_;
}
可以看到,我只是多加了一個引數,加了一個判斷,因為我不想過多的破壞原來的程式碼,所以這樣加了。
在這樣的改造完成後,我遇到的問題都解決了。希望對正在看的你能有所幫助,如果還有問題可以給我留言!
相關推薦
關於微店整合微信支付時出現的的各種問題的記錄 php版
由於公司專案的需要,需要在專案裡整合微信支付,公司原有的專案中已有老版本的支付功能,在此不作討論。我需要作的就是加入新版本的支付功能 讓專案裡可以支援新老兩種版本的功能。在微信官方下載到了新版支付的php版sdk,看到 WxPay.ub.config.php,SDKRunt
如何有效解決微信支付時支付授權目錄出錯問題
訂單 param helper 詳細 如何 zone find 開發 per 在對接微信支付的時候,不管是公眾號支付,還是掃碼支付,都會遇到各種各樣復雜的問題,這些問題說復雜,有時候也挺簡單,只是讓人不容易察覺,一個很簡單的小問題有時候會遇到×××煩。那麽今天跟大家分享一下
微信支付開發出現redirect_uri引數錯誤的解決方法
我們在進行微信支付開發的時候會遇到出現“redirect_uri引數錯誤”這種情況,怎麼辦呢?下面就是我總結出現這種“redirect_uri引數錯誤”的七種可能情況,以及解決方式。 1、可能原因①:授權目錄 支付授權目錄是網站發起請求的頁
微信支付app的各種坑
.info info nbsp clas fff style 輔助 font list android: 簽名要一致,要導出singed包 要記得重啟手機 如果別人的都可以支付,我的不可以,就要退出微信賬號,重新登陸微信賬號一下(不僅僅是退出微信應用)。 ios:
php微信支付介面開發,獲取php微信掃碼支付返回結果,php開發微信支付demo原始碼
現在很多網站都是用php開發的, 一些觀看了子恆老師微信公眾號運營視訊後, 想要更加深入的學習, 留言說“php怎麼做微信支付介面開發呢?” “有沒有php微信支付介面開發的demo例項” 下面來詳細談談… 一、 php微信支付介面開發要做的準備 只有你先準備配置好, 然後才能正確
微信支付後臺介面開發(掃碼版)
一:需求 滿足公司在網頁上達到直接微信掃碼支付的需求 二:API官方文件 參考連結:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1 三:微信支付的過程(使用者-商家-微信伺服器) 四:程式碼實現
微信支付 XML解析工具類 JAVA版
package utils; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEn
微信支付回撥驗證簽名java版V3
微信支付java版V3驗證資料合法性 概要:使用微信支付介面時,微信會返回或回撥給商戶XML資料,開發者需要驗證微信返回的資料是否合法。 特別提醒:商戶系統對於支付結果通知的內容一定要做簽名驗證,防止資料洩漏導致出現“假通知”,造成資金損失。
SSH整合CXF專案啟動時出現告警日誌
spring 4.1.3.RELEASE + cxf 2.5.0框架,在專案啟動時出現一大堆告警日誌,雖然不影響專案正常執行,但看著很刺眼,所以要想辦法清除掉。 告警1:Import of META-INF/cxf/cxf-extension-soap.xml has been de
hadoop hdfs+mahout 整合做協同過濾時出現的兩個異常記錄
再說異常之前 先將專案的pom檔案配置發一下 <dependencies> <dependency> <groupId>org.apache.mahout</groupId>
Python——安裝Scrapy時出現各種錯誤
利用 pip install scrapy 安裝scrapy時 出現的錯誤: Using cached pyzmq-15.4.0.zip Requirement already satisfied (use --upgrade to upgrade): w
自己安裝drozer時出現各種問題的解決
安裝環境: Win7 SP1 、JDK 1.6、Python 2.7 問題1: Could not find java. Please ensure that it isinstalled and on your PATH. If this error persis
執行Git命令時出現各種 SSL certificate problem 的解決辦法
比如我在windows下用git clone gitURL 就提示 SSL certificate problem: self signed certificate 這種問題,在windows下出現得頻率高些。我估計主要是git本身就是基於linux開發的,在windo
iOS 微信支付SDK與微信友盟分享兩者同時整合時,出現的問題與解決之路。
這兩天改版一箇舊的APP,要舊貌換新顏,拿到app後進行編譯,一直報下面的錯誤。 報不認識的符號名PayReq錯誤。奇怪,啥也沒動就這樣,真不知道給的包是不是本來就是個報錯的工程。 不管怎樣,要對它修改就先要跑起來啊。 根據錯誤提示,判斷是libwec
整合微信SDK出現libc++abi.dylib: terminating with uncaught exception of type NSException,微信支付SDKDEMO執行編譯報錯
剛開始整合微信支付就來這樣的報錯,而且微信支付demo也都問題百出,解決了一個又一個 先說說執行微信SDK demo編譯錯誤的問題,其實很簡單: Undefined symbols for architecture x86_64: "_kCFStr
iOS 微信支付SDK與微信友盟分享兩者同時集成時,出現的問題與解決之路。
說明 圖片 根據 red googl 包含 沒有 終端 手動添加 這兩天改版一個舊的APP,要舊貌換新顏,拿到app後進行編譯,一直報下面的錯誤。 報不認識的符號名PayReq錯誤。奇怪,啥也沒動就這樣,真不知道給的包是不是本來就是個報錯的工程。 不管怎樣,要對它修改就先要
解決微信支付出現OUT_TRADE_NO_USED:商戶訂單號重復
image 現在 對待 行修改 沒有 col 業務 界面 描述 在這裏和大家說一下微信APP支付時出現的一個問題! 在APP調起支付的時候出現了錯誤碼:OUT_TRADE_NO_USED:商戶訂單號重復! 1 xxxxxxx312 xxxxxxx 因為
java實現沙箱測試環境支付寶支付(demo)和整合微信支付和支付寶支付到ssm
mar 文件 fun Go examples IT === throws 由於 文章有不當之處,歡迎指正,如果喜歡微信閱讀,你也可以關註我的微信公眾號:好好學java,獲取優質學習資源。 一、支付寶測試環境代碼測試 1.下載電腦網站的官方demo: 下載地址:https:
Thinkphp5整合微信掃碼支付開發例項
ThinkPHP框架是比較多人用的,曾經做過的一個Thinkphp5整合微信掃碼支付開發例項,分享出來大家一起學習 開啟首頁生成訂單,並顯示支付二維碼 public function index() {
Androd整合微信支付和支付寶支付
文章目錄 前言 微信支付 支付寶支付 前言 我們在做App的時候,可能需要接入支付功能,常見的支付有微信支付和支付寶支付。這裡只說明下前端的程式碼邏輯。 微信支付 微信支付開發