建行支付里三大步驟與坑


一、拼建行支付URL獲取支付參數

這一步本來是最簡單的,但是里面有個mac參數,需要md5加密處理,但又未說明對哪些參數加密,造成多次測試失敗

正確的url應該是:

$host = 'https://ibsbjstar.ccb.com.cn/CCBIS/ccbMain?CCB_IBSVersion=V6&';
$string = 'MERCHANTID=00000&POSID=0000&BRANCHID=000&ORDERID=0000&PAYMENT=0.01&CURCODE=01&TXCODE=530590&REMARK1=&REMARK2=&TYPE=1&PUB=00000000&GATEWAY=0&CLIENTIP=127.0.0.1&REGINFO=&PROINFO=%u94bb%u77f3%u4f1a%u5458%u4f18%u60E0%u5927%u4fC3&REFERER=&TRADE_TYPE=MINIPRO&SUB_APPID=0000&SUB_OPENID=0000';
echo $host.$string."&MAC=".md5($string);

  注意字符串里參數順序一定要正確,順序錯了,一樣得不到結果

 

二、回調數據

一般回調數據不是json就是xml之類的,建行的技術指導也是言之鑿鑿說是json數據,所以我使用

file_get_contents('php://input')

來接收數據,但這次建行搞的是直接post過來的是數組,搞得測試了很久,還懷疑域名地址有問題,最后使用laravel里接收參數的方式

request()->input();

獲取的數組信息才算解決。

三、數據驗簽

驗簽的原因就是保存數據來源的正確性,不然萬一有人知道你的回調地址,往你地址里post正確的參數信息,未支付的信息也能給你處理支付了,那可就虧大了

驗簽的方法,建行並沒有詳細說明,文檔也是語焉不詳,我也是各種百度查詢資料,首先是參數參與簽名運算的字符串有順序,要按文檔上說明的順序來做,因為我收的數據是數組,所以剛開始使用的是http_build_query函數把接收的數組拼成字符串,如果你也和我一樣接收的是數組,千萬不要用這個方法,不然進坑半天出不來,因為這個函數有個弊端,如果有數組里的值是null的話,這個數組里的key是不會組成字符串里的參數的,而建行支付要求字符串里參數即使是為空,也要參與到驗簽的,所以自己寫個循環,拼接字符串

$http_build_query = '';
            foreach ($inputMsg as $key => $value) {
                $http_build_query .= $key.'='.$value."&";
            }
            $http_build_query = trim($http_build_query,'&');

  最后驗簽的核心代碼如下:

$key = '你的公鑰';
$data = 'POSID=000&BRANCHID=000&ORDERID=000&PAYMENT=0.01&CURCODE=01&REMARK1=&REMARK2=&ACC_TYPE=WX&SUCCESS=Y&ACCDATE=20210730';
function checkSign($data, $key) {
	$sign = '你收到的建行發來的簽名';
	$pubkey = "-----BEGIN PUBLIC KEY-----\n"
	. wordwrap(base64_encode(Hex2String($key)), 64, "\n", true)
	. "\n-----END PUBLIC KEY-----";
	$pkeyId = openssl_pkey_get_public($pubkey);
	$verify = openssl_verify($data, Hex2String($sign), $pkeyId, OPENSSL_ALGO_MD5);
	openssl_free_key($pkeyId);
	return (bool) $verify;
}



function Hex2String($hex){
	$string = '';
	for ($i = 0; $i < strlen($hex) - 1; $i += 2) {
		$string .= chr(hexdec($hex[$i] . $hex[$i + 1]));
	}
	return $string;
}


if(!checkSign($data,$key)){
	echo "bad";
}else{
	echo "good";
}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM