這篇文章主要為大家展示了“微信支付開發之實現刷卡支付的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“微信支付開發之實現刷卡支付的示例分析”這篇文章吧。


api.mch.weixin.qq.com/pay/micropay
是否需要證書
不需要。
名稱 變量名 必填 類型 示例值 描述
| 公眾賬號ID | appid | 是 | String(32) | wx8888888888888888 | 微信分配的公眾賬號ID(企業號corpid即為此appId) |
| 商戶號 | mch_id | 是 | String(32) | 1900000109 | 微信支付分配的商戶號 |
| 設備號 | device_info | 否 | String(32) | 013467007045764 | 終端設備號(商戶自定義,如門店編號) |
| 隨機字符串 | nonce_str | 是 | String(32) | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | 隨機字符串,不長于32位。推薦隨機數生成算法 |
| 簽名 | sign | 是 | String(32) | C380BEC2BFD727A4B6845133519F3AD6 | 簽名,詳見簽名生成算法 |
| 商品描述 | body | 是 | String(128) | image形象店-深圳騰大- QQ公仔 | 商品簡單描述,該字段須嚴格按照規范傳遞,具體請見參數規定 |
| 商品詳情 | detail | 否 | String(6000) | {
"goods_detail":[
{
"goods_id":"iphone6s_16G",
"wxpay_goods_id":"1001",
"goods_name":"iPhone6s 16G",
"goods_num":1,
"price":528800,
"goods_category":"123456",
"body":"蘋果手機"
},
{
"goods_id":"iphone6s_32G",
"wxpay_goods_id":"1002",
"goods_name":"iPhone6s 32G",
"quantity":1,
"price":608800,
"goods_category":"123789",
"body":"蘋果手機"
}
]
} | 商品詳細列表,使用Json格式,傳輸簽名前請務必使用CDATA標簽將JSON文本串保護起來。 goods_detail []: |
| 附加數據 | attach | 否 | String(127) | 說明 | 附加數據,在查詢API和支付通知中原樣返回,該字段主要用于商戶攜帶訂單的自定義數據 |
| 商戶訂單號 | out_trade_no | 是 | String(32) | 1217752501201407033233368018 | 商戶系統內部的訂單號,32個字符內、可包含字母,其他說明見商戶訂單號 |
| 商品詳情 | detail | 否 | String(8192) | 與提交數據一致 | 實際提交的返回 |
| 訂單金額 | total_fee | 是 | Int | 888 | 訂單總金額,單位為分,只能為整數,詳見支付金額 |
| 貨幣類型 | fee_type | 否 | String(16) | CNY | 符合ISO4217標準的三位字母代碼,默認人民幣:CNY,其他值列表詳見貨幣類型 |
| 終端IP | spbill_create_ip | 是 | String(16) | 8.8.8.8 | 調用微信支付API的機器IP |
| 商品標記 | goods_tag | 否 | String(32) | 商品標記,代金券或立減優惠功能的參數,說明詳見代金券或立減優惠 | |
| 指定支付方式 | limit_pay | 否 | String(32) | no_credit | no_credit--指定不能使用信用卡支付 |
| 授權碼 | auth_code | 是 | String(128) | 120061098828009406 | 掃碼支付授權碼,設備讀取用戶微信中的條碼或者二維碼信息 |
舉例如下:
<xml> <appid>wx2421b1c4370ec43b</appid> <attach>訂單額外描述</attach> <auth_code>120269300684844649</auth_code> <body>刷卡支付測試</body> <device_info>1000</device_info> <goods_tag></goods_tag> <mch_id>10000100</mch_id> <nonce_str>8aaee146b1dee7cec9100add9b96cbe2</nonce_str> <out_trade_no>1415757673</out_trade_no> <spbill_create_ip>14.17.22.52</spbill_create_ip> <time_expire></time_expire> <total_fee>1</total_fee> <sign>C29DB7DB1FD4136B84AE35604756362C</sign> </xml>
注:參數值用XML轉義即可,CDATA標簽用于說明數據不被XML解析器解析。
名稱 變量名 必填 類型 示例值 描述
| 返回狀態碼 | return_code | 是 | String(16) | SUCCESS | SUCCESS/FAIL 此字段是通信標識,非交易標識,交易是否成功需要查看result_code來判斷 |
| 返回信息 | return_msg | 否 | String(128) | 簽名失敗 | 返回信息,如非空,為錯誤原因 簽名失敗 參數格式校驗錯誤 |
當return_code為SUCCESS的時候,還會包括以下字段:
名稱 變量名 必填 類型 示例值 描述
| 公眾賬號ID | appid | 是 | String(32) | wx8888888888888888 | 調用接口提交的公眾賬號ID |
| 商戶號 | mch_id | 是 | String(32) | 1900000109 | 調用接口提交的商戶號 |
| 設備號 | device_info | 否 | String(32) | 013467007045764 | 調用接口提交的終端設備號, |
| 隨機字符串 | nonce_str | 是 | String(32) | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | 微信返回的隨機字符串 |
| 簽名 | sign | 是 | String(32) | C380BEC2BFD727A4B6845133519F3AD6 | 微信返回的簽名,詳見簽名生成算法 |
| 業務結果 | result_code | 是 | String(16) | SUCCESS | SUCCESS/FAIL |
| 錯誤代碼 | err_code | 否 | String(32) | SYSTEMERROR | 詳細參見錯誤列表 |
| 錯誤代碼描述 | err_code_des | 否 | String(128) | 系統錯誤 | 錯誤返回的信息描述 |
當return_code 和result_code都為SUCCESS的時,還會包括以下字段:
名稱 變量名 必填 類型 示例值 描述
| 用戶標識 | openid | 是 | String(128) | Y | 用戶在商戶appid 下的唯一標識 |
| 是否關注公眾賬號 | is_subscribe | 是 | String(1) | Y | 用戶是否關注公眾賬號,僅在公眾賬號類型支付有效,取值范圍:Y或N;Y-關注;N-未關注 |
| 交易類型 | trade_type | 是 | String(16) | MICROPAY | 支付類型為MICROPAY(即掃碼支付) |
| 付款銀行 | bank_type | 是 | String(16) | CMC | 銀行類型,采用字符串類型的銀行標識,值列表詳見銀行類型 |
| 貨幣類型 | fee_type | 否 | String(16) | CNY | 符合ISO 4217標準的三位字母代碼,默認人民幣:CNY,其他值列表詳見貨幣類型 |
| 訂單金額 | total_fee | 是 | Int | 888 | 訂單總金額,單位為分,只能為整數,詳見支付金額 |
| 現金支付貨幣類型 | cash_fee_type | 否 | String(16) | CNY | 符合ISO 4217標準的三位字母代碼,默認人民幣:CNY,其他值列表詳見貨幣類型 |
| 現金支付金額 | cash_fee | 是 | Int | 100 | 訂單現金支付金額,詳見支付金額 |
| 微信支付訂單號 | transaction_id | 是 | String(32) | 1217752501201407033233368018 | 微信支付訂單號 |
| 商戶訂單號 | out_trade_no | 是 | String(32) | 1217752501201407033233368018 | 商戶系統的訂單號,與請求一致。 |
| 商家數據包 | attach | 否 | String(128) | 123456 | 商家數據包,原樣返回 |
| 支付完成時間 | time_end | 是 | String(14) | 20141030133525 | 訂單生成時間,格式為yyyyMMddHHmmss,如2009年12月25日9點10分10秒表示為20091225091010。詳見時間規則 |
舉例如下:
<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> <appid><![CDATA[wx2421b1c4370ec43b]]></appid> <mch_id><![CDATA[10000100]]></mch_id> <device_info><![CDATA[1000]]></device_info> <nonce_str><![CDATA[GOp3TRyMXzbMlkun]]></nonce_str> <sign><![CDATA[D6C76CB785F07992CDE05494BB7DF7FD]]></sign> <result_code><![CDATA[SUCCESS]]></result_code> <openid><![CDATA[oUpF8uN95-Ptaags6E_roPHg7AG0]]></openid> <is_subscribe><![CDATA[Y]]></is_subscribe> <trade_type><![CDATA[MICROPAY]]></trade_type> <bank_type><![CDATA[CCB_DEBIT]]></bank_type> <total_fee>1</total_fee> <coupon_fee>0</coupon_fee> <fee_type><![CDATA[CNY]]></fee_type> <transaction_id><![CDATA[1008450740201411110005820873]]></transaction_id> <out_trade_no><![CDATA[1415757673]]></out_trade_no> <attach><![CDATA[訂單額外描述]]></attach> <time_end><![CDATA[20141111170043]]></time_end> </xml>
在微信支付原來的微信支付類文件中,仿照統一支付類的方式,添加刷卡支付類如下:
/**
* 刷卡支付接口類
*/
class MicroPay_pub extends Wxpay_client_pub
{
function __construct()
{
//設置接口鏈接
$this->url = "https://api.mch.weixin.qq.com/pay/micropay";
//設置curl超時時間
$this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
}
/**
* 生成接口參數xml
*/
function createXml()
{
try
{
//檢測必填參數
if($this->parameters["out_trade_no"] == null){
throw new SDKRuntimeException("缺少統一支付接口必填參數out_trade_no!"."<br>");
}elseif($this->parameters["body"] == null){
throw new SDKRuntimeException("缺少統一支付接口必填參數body!"."<br>");
}elseif ($this->parameters["total_fee"] == null ) {
throw new SDKRuntimeException("缺少統一支付接口必填參數total_fee!"."<br>");
}elseif ($this->parameters["auth_code"] == null) {
throw new SDKRuntimeException("缺少統一支付接口必填參數auth_code!"."<br>");
}
$this->parameters["appid"] = WxPayConf_pub::APPID;//公眾賬號ID
$this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商戶號
$this->parameters["spbill_create_ip"] = $_SERVER['REMOTE_ADDR'];//終端ip
$this->parameters["nonce_str"] = $this->createNoncestr();//隨機字符串
$this->parameters["sign"] = $this->getSign($this->parameters);//簽名
// var_dump($this->parameters);
return $this->arrayToXml($this->parameters);
}catch (SDKRuntimeException $e)
{
die($e->errorMessage());
}
}
}原有的基礎類和請求類也列出如下:
/**
* 所有接口的基類
*/
class Common_util_pub
{
function __construct() {
}
function trimString($value)
{
$ret = null;
if (null != $value)
{
$ret = $value;
if (strlen($ret) == 0)
{
$ret = null;
}
}
return $ret;
}
/**
* 作用:產生隨機字符串,不長于32位
*/
public function createNoncestr( $length = 32 )
{
$chars = "abcdefghijklmnopqrstuvwxyz0123456789";
$str ="";
for ( $i = 0; $i < $length; $i++ ) {
$str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);
}
return $str;
}
/**
* 作用:格式化參數,簽名過程需要使用
*/
function formatBizQueryParaMap($paraMap, $urlencode)
{
$buff = "";
ksort($paraMap);
foreach ($paraMap as $k => $v)
{
if($urlencode)
{
$v = urlencode($v);
}
//$buff .= strtolower($k) . "=" . $v . "&";
$buff .= $k . "=" . $v . "&";
}
$reqPar;
if (strlen($buff) > 0)
{
$reqPar = substr($buff, 0, strlen($buff)-1);
}
return $reqPar;
}
/**
* 作用:生成簽名
*/
public function getSign($Obj)
{
foreach ($Obj as $k => $v)
{
$Parameters[$k] = $v;
}
//簽名步驟一:按字典序排序參數
ksort($Parameters);
$String = $this->formatBizQueryParaMap($Parameters, false);
//echo '【string1】'.$String.'</br>';
//簽名步驟二:在string后加入KEY
$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_;
}
/**
* 作用:array轉xml
*/
function arrayToXml($arr)
{
$xml = "<xml>";
foreach ($arr as $key=>$val)
{
if (is_numeric($val))
{
$xml.="<".$key.">".$val."</".$key.">";
}
else
$xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
}
$xml.="</xml>";
return $xml;
}
/**
* 作用:將xml轉為array
*/
public function xmlToArray($xml)
{
//將XML轉為array
$array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $array_data;
}
/**
* 作用:以post方式提交xml到對應的接口url
*/
public function postXmlCurl($xml,$url,$second=30)
{
//初始化curl
$ch = curl_init();
//設置超時
curl_setopt($ch, CURLOP_TIMEOUT, $second);
//這里設置代理,如果有的話
//curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8');
//curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
//設置header
curl_setopt($ch, CURLOPT_HEADER, FALSE);
//要求結果為字符串且輸出到屏幕上
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
//post提交方式
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
//運行curl
$data = curl_exec($ch);
curl_close($ch);
//返回結果
if($data)
{
curl_close($ch);
return $data;
}
else
{
$error = curl_errno($ch);
echo "curl出錯,錯誤碼:$error"."<br>";
echo "<a href='http://curl.haxx.se/libcurl/c/libcurl-errors.html'>錯誤原因查詢</a></br>";
curl_close($ch);
return false;
}
}
/**
* 作用:使用證書,以post方式提交xml到對應的接口url
*/
function postXmlSSLCurl($xml,$url,$second=30)
{
$ch = curl_init();
//超時時間
curl_setopt($ch,CURLOPT_TIMEOUT,$second);
//這里設置代理,如果有的話
//curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8');
//curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
//設置header
curl_setopt($ch,CURLOPT_HEADER,FALSE);
//要求結果為字符串且輸出到屏幕上
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
//設置證書
//使用證書:cert 與 key 分別屬于兩個.pem文件
//默認格式為PEM,可以注釋
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLCERT, dirname(__FILE__).WxPayConf_pub::SSLCERT_PATH);
//默認格式為PEM,可以注釋
curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLKEY, dirname(__FILE__).WxPayConf_pub::SSLKEY_PATH);
//post提交方式
curl_setopt($ch,CURLOPT_POST, true);
curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);
$data = curl_exec($ch);
//返回結果
if($data){
curl_close($ch);
return $data;
}
else {
$error = curl_errno($ch);
echo "curl出錯,錯誤碼:$error"."<br>";
echo "<a href='http://curl.haxx.se/libcurl/c/libcurl-errors.html'>錯誤原因查詢</a></br>";
curl_close($ch);
return false;
}
}
/**
* 作用:打印數組
*/
function printErr($wording='',$err='')
{
print_r('<pre>');
echo $wording."</br>";
var_dump($err);
print_r('</pre>');
}
}
/**
* 請求型接口的基類
*/
class Wxpay_client_pub extends Common_util_pub
{
var $parameters;//請求參數,類型為關聯數組
public $response;//微信返回的響應
public $result;//返回參數,類型為關聯數組
var $url;//接口鏈接
var $curl_timeout;//curl超時時間
/**
* 作用:設置請求參數
*/
function setParameter($parameter, $parameterValue)
{
$this->parameters[$this->trimString($parameter)] = $this->trimString($parameterValue);
}
/**
* 作用:設置標配的請求參數,生成簽名,生成接口參數xml
*/
function createXml()
{
$this->parameters["appid"] = WxPayConf_pub::APPID;//公眾賬號ID
$this->parameters["mch_id"] = WxPayConf_pub::MCHID;//商戶號
$this->parameters["nonce_str"] = $this->createNoncestr();//隨機字符串
$this->parameters["sign"] = $this->getSign($this->parameters);//簽名
return $this->arrayToXml($this->parameters);
}
/**
* 作用:post請求xml
*/
function postXml()
{
$xml = $this->createXml();
$this->response = $this->postXmlCurl($xml,$this->url,$this->curl_timeout);
return $this->response;
}
/**
* 作用:使用證書post請求xml
*/
function postXmlSSL()
{
$xml = $this->createXml();
$this->response = $this->postXmlSSLCurl($xml,$this->url,$this->curl_timeout);
return $this->response;
}
/**
* 作用:獲取結果,默認不使用證書
*/
function getResult()
{
$this->postXml();
$this->result = $this->xmlToArray($this->response);
return $this->result;
}
}在程序中,獲得用戶的授權碼,并填入到$authcode參數中。授權碼就是條碼上的那一串18位純數字,以10、11、12、13、14、15開頭
其他參數則自動生成或者手動輸入指定。
調用函數如下所示
//全局引入微信支付類
Vendor('Wxpay.WxPayPubHelper.WxPayPubHelper');
//使用統一支付接口
$microPay = new \MicroPay_pub();
//設置統一支付接口參數
$microPay->setParameter("body","方倍商戶刷卡支付");//商品描述
$microPay->setParameter("out_trade_no", "$out_trade_no");//商戶訂單號
$microPay->setParameter("total_fee", $total_fee);//總金額
$microPay->setParameter("auth_code", $authcode);//授權碼
//獲取統一支付接口結果
$microPayResult = $microPay->getResult();
//3. 異常判斷
if (!isset($microPayResult["result_code"]) || ($microPayResult["result_code"] == "FAIL")) {
$this->resRpcError(isset($microPayResult['result_code']) ? $microPayResult['err_code_des'] : $microPayResult['return_msg'], "21000");
}以上是“微信支付開發之實現刷卡支付的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。