1. 程式人生 > >關於微店整合微信支付時出現的的各種問題的記錄 php版

關於微店整合微信支付時出現的的各種問題的記錄 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

支付回撥驗證簽名javaV3

微信支付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的時候,可能需要接入支付功能,常見的支付有微信支付和支付寶支付。這裡只說明下前端的程式碼邏輯。 微信支付 微信支付開發