定位至php
CODE /** * 將xml轉爲array * @param string $xml * @throws WxPayException */ public static function Init($xml) { $obj = new self(); $obj->FromXml($xml); return 123; return $obj; //fix bug 2015-06-29 if($obj->values['return_code'] != 'SUCCESS'){ return $obj->GetValues(); } $obj->CheckSign(); return $obj->GetValues(); }
CODE /** * 將xml轉爲array * @param string $xml * @throws WxPayException */ public static function Init($xml) { $obj = new self(); $obj->FromXml($xml); // return 123; return $obj; //fix bug 2015-06-29 if($obj->values['return_code'] != 'SUCCESS'){ return $obj->GetValues(); } $obj->CheckSign(); return $obj->GetValues(); }
CODE /** * * 檢測簽名 */ public function CheckSign() { return false; //fix異常 if(!$this->IsSignSet()){ throw new WxPayException("簽名錯誤!"); } $sign = $this->MakeSign(); if($this->GetSign() == $sign){ return true; } throw new WxPayException("簽名錯誤!"); }
CODE /** * 將xml轉爲array * @param string $xml * @throws WxPayException */ public static function Init($xml) { $obj = new self(); $obj->FromXml($xml); // return 123; //fix bug 2015-06-29 if($obj->values['return_code'] != 'SUCCESS'){ return $obj->GetValues(); } $obj->CheckSign(); return $obj->GetValues(); }
w算法
斷點下的斷點json
$result = WxPayResults::Init($response);
CODE /** * 將xml轉爲array * @param string $xml * @throws WxPayException */ public static function Init($xml) { $obj = new self(); $obj->FromXml($xml); return 123; //fix bug 2015-06-29 if($obj->values['return_code'] != 'SUCCESS'){ return $obj->GetValues(); } $obj->CheckSign(); return $obj->GetValues(); }
1 CODE 2 3 public static function Init($xml) 4 { 5 $obj = new self(); 6 $obj->FromXml($xml); 7 //fix bug 2015-06-29 8 if($obj->values['return_code'] != 'SUCCESS'){ 9 return $obj->GetValues(); 10 } 11 $obj->CheckSign(); 12 return $obj->GetValues(); 13 }
CODE <?php /** * 2015-06-29 修復簽名問題 **/ require_once "WxPay.Config.php"; require_once "WxPay.Exception.php"; /** * * 數據對象基礎類,該類中定義數據類最基本的行爲,包括: * 計算/設置/獲取簽名、輸出xml格式的參數、從xml讀取數據對象等 * @author widyhu * */ class WxPayDataBase { protected $values = array(); /** * 設置簽名,詳見簽名生成算法 * @param string $value **/ public function SetSign() { $sign = $this->MakeSign(); $this->values['sign'] = $sign; return $sign; } /** * 獲取簽名,詳見簽名生成算法的值 * @return 值 **/ public function GetSign() { return $this->values['sign']; } /** * 判斷簽名,詳見簽名生成算法是否存在 * @return true 或 false **/ public function IsSignSet() { return array_key_exists('sign', $this->values); } /** * 輸出xml字符 * @throws WxPayException **/ public function ToXml() { if(!is_array($this->values) || count($this->values) <= 0) { throw new WxPayException("數組數據異常!"); } $xml = "<xml>"; foreach ($this->values as $key=>$val) { if (is_numeric($val)){ $xml.="<".$key.">".$val."</".$key.">"; }else{ $xml.="<".$key."><![CDATA[".$val."]]></".$key.">"; } } $xml.="</xml>"; return $xml; } /** * 將xml轉爲array * @param string $xml * @throws WxPayException */ public function FromXml($xml) { if(!$xml){ throw new WxPayException("xml數據異常!"); } //將XML轉爲array //禁止引用外部xml實體 libxml_disable_entity_loader(true); $this->values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); return $this->values; } /** * 格式化參數格式化成url參數 */ public function ToUrlParams() { $buff = ""; foreach ($this->values as $k => $v) { if($k != "sign" && $v != "" && !is_array($v)){ $buff .= $k . "=" . $v . "&"; } } $buff = trim($buff, "&"); return $buff; } /** * 生成簽名 * @return 簽名,本函數不覆蓋sign成員變量,如要設置簽名須要調用SetSign方法賦值 */ public function MakeSign() { //簽名步驟一:按字典序排序參數 ksort($this->values); $string = $this->ToUrlParams(); //簽名步驟二:在string後加入KEY $string = $string . "&key=".WxPayConfig::KEY; //簽名步驟三:MD5加密 $string = md5($string); //簽名步驟四:全部字符轉爲大寫 $result = strtoupper($string); return $result; } /** * 獲取設置的值 */ public function GetValues() { return $this->values; } } /** * * 接口調用結果類 * @author widyhu * */ class WxPayResults extends WxPayDataBase { /** * * 檢測簽名 */ public function CheckSign() { //fix異常 if(!$this->IsSignSet()){ throw new WxPayException("簽名錯誤!"); } $sign = $this->MakeSign(); if($this->GetSign() == $sign){ return true; } throw new WxPayException("簽名錯誤!"); } /** * * 使用數組初始化 * @param array $array */ public function FromArray($array) { $this->values = $array; } /** * * 使用數組初始化對象 * @param array $array * @param 是否檢測簽名 $noCheckSign */ public static function InitFromArray($array, $noCheckSign = false) { $obj = new self(); $obj->FromArray($array); if($noCheckSign == false){ $obj->CheckSign(); } return $obj; } /** * * 設置參數 * @param string $key * @param string $value */ public function SetData($key, $value) { $this->values[$key] = $value; } /** * 將xml轉爲array * @param string $xml * @throws WxPayException */ public static function Init($xml) { $obj = new self(); $obj->FromXml($xml); //fix bug 2015-06-29 if($obj->values['return_code'] != 'SUCCESS'){ return $obj->GetValues(); } $obj->CheckSign(); return $obj->GetValues(); } } /** * * 回調基礎類 * @author widyhu * */ class WxPayNotifyReply extends WxPayDataBase { /** * * 設置錯誤碼 FAIL 或者 SUCCESS * @param string */ public function SetReturn_code($return_code) { $this->values['return_code'] = $return_code; } /** * * 獲取錯誤碼 FAIL 或者 SUCCESS * @return string $return_code */ public function GetReturn_code() { return $this->values['return_code']; } /** * * 設置錯誤信息 * @param string $return_code */ public function SetReturn_msg($return_msg) { $this->values['return_msg'] = $return_msg; } /** * * 獲取錯誤信息 * @return string */ public function GetReturn_msg() { return $this->values['return_msg']; } /** * * 設置返回參數 * @param string $key * @param string $value */ public function SetData($key, $value) { $this->values[$key] = $value; } } /** * * 統一下單輸入對象 * @author widyhu * */ class WxPayUnifiedOrder extends WxPayDataBase { /** * 設置微信分配的公衆帳號ID * @param string $value **/ public function SetAppid($value) { $this->values['appid'] = $value; } /** * 獲取微信分配的公衆帳號ID的值 * @return 值 **/ public function GetAppid() { return $this->values['appid']; } /** * 判斷微信分配的公衆帳號ID是否存在 * @return true 或 false **/ public function IsAppidSet() { return array_key_exists('appid', $this->values); } /** * 設置微信支付分配的商戶號 * @param string $value **/ public function SetMch_id($value) { $this->values['mch_id'] = $value; } /** * 獲取微信支付分配的商戶號的值 * @return 值 **/ public function GetMch_id() { return $this->values['mch_id']; } /** * 判斷微信支付分配的商戶號是否存在 * @return true 或 false **/ public function IsMch_idSet() { return array_key_exists('mch_id', $this->values); } /** * 設置微信支付分配的終端設備號,商戶自定義 * @param string $value **/ public function SetDevice_info($value) { $this->values['device_info'] = $value; } /** * 獲取微信支付分配的終端設備號,商戶自定義的值 * @return 值 **/ public function GetDevice_info() { return $this->values['device_info']; } /** * 判斷微信支付分配的終端設備號,商戶自定義是否存在 * @return true 或 false **/ public function IsDevice_infoSet() { return array_key_exists('device_info', $this->values); } /** * 設置隨機字符串,不長於32位。推薦隨機數生成算法 * @param string $value **/ public function SetNonce_str($value) { $this->values['nonce_str'] = $value; } /** * 獲取隨機字符串,不長於32位。推薦隨機數生成算法的值 * @return 值 **/ public function GetNonce_str() { return $this->values['nonce_str']; } /** * 判斷隨機字符串,不長於32位。推薦隨機數生成算法是否存在 * @return true 或 false **/ public function IsNonce_strSet() { return array_key_exists('nonce_str', $this->values); } /** * 設置商品或支付單簡要描述 * @param string $value **/ public function SetBody($value) { $this->values['body'] = $value; } /** * 獲取商品或支付單簡要描述的值 * @return 值 **/ public function GetBody() { return $this->values['body']; } /** * 判斷商品或支付單簡要描述是否存在 * @return true 或 false **/ public function IsBodySet() { return array_key_exists('body', $this->values); } /** * 設置商品名稱明細列表 * @param string $value **/ public function SetDetail($value) { $this->values['detail'] = $value; } /** * 獲取商品名稱明細列表的值 * @return 值 **/ public function GetDetail() { return $this->values['detail']; } /** * 判斷商品名稱明細列表是否存在 * @return true 或 false **/ public function IsDetailSet() { return array_key_exists('detail', $this->values); } /** * 設置附加數據,在查詢API和支付通知中原樣返回,該字段主要用於商戶攜帶訂單的自定義數據 * @param string $value **/ public function SetAttach($value) { $this->values['attach'] = $value; } /** * 獲取附加數據,在查詢API和支付通知中原樣返回,該字段主要用於商戶攜帶訂單的自定義數據的值 * @return 值 **/ public function GetAttach() { return $this->values['attach']; } /** * 判斷附加數據,在查詢API和支付通知中原樣返回,該字段主要用於商戶攜帶訂單的自定義數據是否存在 * @return true 或 false **/ public function IsAttachSet() { return array_key_exists('attach', $this->values); } /** * 設置商戶系統內部的訂單號,32個字符內、可包含字母, 其餘說明見商戶訂單號 * @param string $value **/ public function SetOut_trade_no($value) { $this->values['out_trade_no'] = $value; } /** * 獲取商戶系統內部的訂單號,32個字符內、可包含字母, 其餘說明見商戶訂單號的值 * @return 值 **/ public function GetOut_trade_no() { return $this->values['out_trade_no']; } /** * 判斷商戶系統內部的訂單號,32個字符內、可包含字母, 其餘說明見商戶訂單號是否存在 * @return true 或 false **/ public function IsOut_trade_noSet() { return array_key_exists('out_trade_no', $this->values); } /** * 設置符合ISO 4217標準的三位字母代碼,默認人民幣:CNY,其餘值列表詳見貨幣類型 * @param string $value **/ public function SetFee_type($value) { $this->values['fee_type'] = $value; } /** * 獲取符合ISO 4217標準的三位字母代碼,默認人民幣:CNY,其餘值列表詳見貨幣類型的值 * @return 值 **/ public function GetFee_type() { return $this->values['fee_type']; } /** * 判斷符合ISO 4217標準的三位字母代碼,默認人民幣:CNY,其餘值列表詳見貨幣類型是否存在 * @return true 或 false **/ public function IsFee_typeSet() { return array_key_exists('fee_type', $this->values); } /** * 設置訂單總金額,只能爲整數,詳見支付金額 * @param string $value **/ public function SetTotal_fee($value) { $this->values['total_fee'] = $value; } /** * 獲取訂單總金額,只能爲整數,詳見支付金額的值 * @return 值 **/ public function GetTotal_fee() { return $this->values['total_fee']; } /** * 判斷訂單總金額,只能爲整數,詳見支付金額是否存在 * @return true 或 false **/ public function IsTotal_feeSet() { return array_key_exists('total_fee', $this->values); } /** * 設置APP和網頁支付提交用戶端ip,Native支付填調用微信支付API的機器IP。 * @param string $value **/ public function SetSpbill_create_ip($value) { $this->values['spbill_create_ip'] = $value; } /** * 獲取APP和網頁支付提交用戶端ip,Native支付填調用微信支付API的機器IP。的值 * @return 值 **/ public function GetSpbill_create_ip() { return $this->values['spbill_create_ip']; } /** * 判斷APP和網頁支付提交用戶端ip,Native支付填調用微信支付API的機器IP。是否存在 * @return true 或 false **/ public function IsSpbill_create_ipSet() { return array_key_exists('spbill_create_ip', $this->values); } /** * 設置訂單生成時間,格式爲yyyyMMddHHmmss,如2009年12月25日9點10分10秒錶示爲20091225091010。其餘詳見時間規則 * @param string $value **/ public function SetTime_start($value) { $this->values['time_start'] = $value; } /** * 獲取訂單生成時間,格式爲yyyyMMddHHmmss,如2009年12月25日9點10分10秒錶示爲20091225091010。其餘詳見時間規則的值 * @return 值 **/ public function GetTime_start() { return $this->values['time_start']; } /** * 判斷訂單生成時間,格式爲yyyyMMddHHmmss,如2009年12月25日9點10分10秒錶示爲20091225091010。其餘詳見時間規則是否存在 * @return true 或 false **/ public function IsTime_startSet() { return array_key_exists('time_start', $this->values); } /** * 設置訂單失效時間,格式爲yyyyMMddHHmmss,如2009年12月27日9點10分10秒錶示爲20091227091010。其餘詳見時間規則 * @param string $value **/ public function SetTime_expire($value) { $this->values['time_expire'] = $value; } /** * 獲取訂單失效時間,格式爲yyyyMMddHHmmss,如2009年12月27日9點10分10秒錶示爲20091227091010。其餘詳見時間規則的值 * @return 值 **/ public function GetTime_expire() { return $this->values['time_expire']; } /** * 判斷訂單失效時間,格式爲yyyyMMddHHmmss,如2009年12月27日9點10分10秒錶示爲20091227091010。其餘詳見時間規則是否存在 * @return true 或 false **/ public function IsTime_expireSet() { return array_key_exists('time_expire', $this->values); } /** * 設置商品標記,代金券或立減優惠功能的參數,說明詳見代金券或立減優惠 * @param string $value **/ public function SetGoods_tag($value) { $this->values['goods_tag'] = $value; } /** * 獲取商品標記,代金券或立減優惠功能的參數,說明詳見代金券或立減優惠的值 * @return 值 **/ public function GetGoods_tag() { return $this->values['goods_tag']; } /** * 判斷商品標記,代金券或立減優惠功能的參數,說明詳見代金券或立減優惠是否存在 * @return true 或 false **/ public function IsGoods_tagSet() { return array_key_exists('goods_tag', $this->values); } /** * 設置接收微信支付異步通知回調地址 * @param string $value **/ public function SetNotify_url($value) { $this->values['notify_url'] = $value; } /** * 獲取接收微信支付異步通知回調地址的值 * @return 值 **/ public function GetNotify_url() { return $this->values['notify_url']; } /** * 判斷接收微信支付異步通知回調地址是否存在 * @return true 或 false **/ public function IsNotify_urlSet() { return array_key_exists('notify_url', $this->values); } /** * 設置取值以下:JSAPI,NATIVE,APP,詳細說明見參數規定 * @param string $value **/ public function SetTrade_type($value) { $this->values['trade_type'] = $value; } /** * 獲取取值以下:JSAPI,NATIVE,APP,詳細說明見參數規定的值 * @return 值 **/ public function GetTrade_type() { return $this->values['trade_type']; } /** * 判斷取值以下:JSAPI,NATIVE,APP,詳細說明見參數規定是否存在 * @return true 或 false **/ public function IsTrade_typeSet() { return array_key_exists('trade_type', $this->values); } /** * 設置trade_type=NATIVE,此參數必傳。此id爲二維碼中包含的商品ID,商戶自行定義。 * @param string $value **/ public function SetProduct_id($value) { $this->values['product_id'] = $value; } /** * 獲取trade_type=NATIVE,此參數必傳。此id爲二維碼中包含的商品ID,商戶自行定義。的值 * @return 值 **/ public function GetProduct_id() { return $this->values['product_id']; } /** * 判斷trade_type=NATIVE,此參數必傳。此id爲二維碼中包含的商品ID,商戶自行定義。是否存在 * @return true 或 false **/ public function IsProduct_idSet() { return array_key_exists('product_id', $this->values); } /** * 設置trade_type=JSAPI,此參數必傳,用戶在商戶appid下的惟一標識。下單前須要調用【網頁受權獲取用戶信息】接口獲取到用戶的Openid。 * @param string $value **/ public function SetOpenid($value) { $this->values['openid'] = $value; } /** * 獲取trade_type=JSAPI,此參數必傳,用戶在商戶appid下的惟一標識。下單前須要調用【網頁受權獲取用戶信息】接口獲取到用戶的Openid。 的值 * @return 值 **/ public function GetOpenid() { return $this->values['openid']; } /** * 判斷trade_type=JSAPI,此參數必傳,用戶在商戶appid下的惟一標識。下單前須要調用【網頁受權獲取用戶信息】接口獲取到用戶的Openid。 是否存在 * @return true 或 false **/ public function IsOpenidSet() { return array_key_exists('openid', $this->values); } } /** * * 訂單查詢輸入對象 * @author widyhu * */ class WxPayOrderQuery extends WxPayDataBase { /** * 設置微信分配的公衆帳號ID * @param string $value **/ public function SetAppid($value) { $this->values['appid'] = $value; } /** * 獲取微信分配的公衆帳號ID的值 * @return 值 **/ public function GetAppid() { return $this->values['appid']; } /** * 判斷微信分配的公衆帳號ID是否存在 * @return true 或 false **/ public function IsAppidSet() { return array_key_exists('appid', $this->values); } /** * 設置微信支付分配的商戶號 * @param string $value **/ public function SetMch_id($value) { $this->values['mch_id'] = $value; } /** * 獲取微信支付分配的商戶號的值 * @return 值 **/ public function GetMch_id() { return $this->values['mch_id']; } /** * 判斷微信支付分配的商戶號是否存在 * @return true 或 false **/ public function IsMch_idSet() { return array_key_exists('mch_id', $this->values); } /** * 設置微信的訂單號,優先使用 * @param string $value **/ public function SetTransaction_id($value) { $this->values['transaction_id'] = $value; } /** * 獲取微信的訂單號,優先使用的值 * @return 值 **/ public function GetTransaction_id() { return $this->values['transaction_id']; } /** * 判斷微信的訂單號,優先使用是否存在 * @return true 或 false **/ public function IsTransaction_idSet() { return array_key_exists('transaction_id', $this->values); } /** * 設置商戶系統內部的訂單號,當沒提供transaction_id時須要傳這個。 * @param string $value **/ public function SetOut_trade_no($value) { $this->values['out_trade_no'] = $value; } /** * 獲取商戶系統內部的訂單號,當沒提供transaction_id時須要傳這個。的值 * @return 值 **/ public function GetOut_trade_no() { return $this->values['out_trade_no']; } /** * 判斷商戶系統內部的訂單號,當沒提供transaction_id時須要傳這個。是否存在 * @return true 或 false **/ public function IsOut_trade_noSet() { return array_key_exists('out_trade_no', $this->values); } /** * 設置隨機字符串,不長於32位。推薦隨機數生成算法 * @param string $value **/ public function SetNonce_str($value) { $this->values['nonce_str'] = $value; } /** * 獲取隨機字符串,不長於32位。推薦隨機數生成算法的值 * @return 值 **/ public function GetNonce_str() { return $this->values['nonce_str']; } /** * 判斷隨機字符串,不長於32位。推薦隨機數生成算法是否存在 * @return true 或 false **/ public function IsNonce_strSet() { return array_key_exists('nonce_str', $this->values); } } /** * * 關閉訂單輸入對象 * @author widyhu * */ class WxPayCloseOrder extends WxPayDataBase { /** * 設置微信分配的公衆帳號ID * @param string $value **/ public function SetAppid($value) { $this->values['appid'] = $value; } /** * 獲取微信分配的公衆帳號ID的值 * @return 值 **/ public function GetAppid() { return $this->values['appid']; } /** * 判斷微信分配的公衆帳號ID是否存在 * @return true 或 false **/ public function IsAppidSet() { return array_key_exists('appid', $this->values); } /** * 設置微信支付分配的商戶號 * @param string $value **/ public function SetMch_id($value) { $this->values['mch_id'] = $value; } /** * 獲取微信支付分配的商戶號的值 * @return 值 **/ public function GetMch_id() { return $this->values['mch_id']; } /** * 判斷微信支付分配的商戶號是否存在 * @return true 或 false **/ public function IsMch_idSet() { return array_key_exists('mch_id', $this->values); } /** * 設置商戶系統內部的訂單號 * @param string $value **/ public function SetOut_trade_no($value) { $this->values['out_trade_no'] = $value; } /** * 獲取商戶系統內部的訂單號的值 * @return 值 **/ public function GetOut_trade_no() { return $this->values['out_trade_no']; } /** * 判斷商戶系統內部的訂單號是否存在 * @return true 或 false **/ public function IsOut_trade_noSet() { return array_key_exists('out_trade_no', $this->values); } /** * 設置商戶系統內部的訂單號,32個字符內、可包含字母, 其餘說明見商戶訂單號 * @param string $value **/ public function SetNonce_str($value) { $this->values['nonce_str'] = $value; } /** * 獲取商戶系統內部的訂單號,32個字符內、可包含字母, 其餘說明見商戶訂單號的值 * @return 值 **/ public function GetNonce_str() { return $this->values['nonce_str']; } /** * 判斷商戶系統內部的訂單號,32個字符內、可包含字母, 其餘說明見商戶訂單號是否存在 * @return true 或 false **/ public function IsNonce_strSet() { return array_key_exists('nonce_str', $this->values); } } /** * * 提交退款輸入對象 * @author widyhu * */ class WxPayRefund extends WxPayDataBase { /** * 設置微信分配的公衆帳號ID * @param string $value **/ public function SetAppid($value) { $this->values['appid'] = $value; } /** * 獲取微信分配的公衆帳號ID的值 * @return 值 **/ public function GetAppid() { return $this->values['appid']; } /** * 判斷微信分配的公衆帳號ID是否存在 * @return true 或 false **/ public function IsAppidSet() { return array_key_exists('appid', $this->values); } /** * 設置微信支付分配的商戶號 * @param string $value **/ public function SetMch_id($value) { $this->values['mch_id'] = $value; } /** * 獲取微信支付分配的商戶號的值 * @return 值 **/ public function GetMch_id() { return $this->values['mch_id']; } /** * 判斷微信支付分配的商戶號是否存在 * @return true 或 false **/ public function IsMch_idSet() { return array_key_exists('mch_id', $this->values); } /** * 設置微信支付分配的終端設備號,與下單一致 * @param string $value **/ public function SetDevice_info($value) { $this->values['device_info'] = $value; } /** * 獲取微信支付分配的終端設備號,與下單一致的值 * @return 值 **/ public function GetDevice_info() { return $this->values['device_info']; } /** * 判斷微信支付分配的終端設備號,與下單一致是否存在 * @return true 或 false **/ public function IsDevice_infoSet() { return array_key_exists('device_info', $this->values); } /** * 設置隨機字符串,不長於32位。推薦隨機數生成算法 * @param string $value **/ public function SetNonce_str($value) { $this->values['nonce_str'] = $value; } /** * 獲取隨機字符串,不長於32位。推薦隨機數生成算法的值 * @return 值 **/ public function GetNonce_str() { return $this->values['nonce_str']; } /** * 判斷隨機字符串,不長於32位。推薦隨機數生成算法是否存在 * @return true 或 false **/ public function IsNonce_strSet() { return array_key_exists('nonce_str', $this->values); } /** * 設置微信訂單號 * @param string $value **/ public function SetTransaction_id($value) { $this->values['transaction_id'] = $value; } /** * 獲取微信訂單號的值 * @return 值 **/ public function GetTransaction_id() { return $this->values['transaction_id']; } /** * 判斷微信訂單號是否存在 * @return true 或 false **/ public function IsTransaction_idSet() { return array_key_exists('transaction_id', $this->values); } /** * 設置商戶系統內部的訂單號,transaction_id、out_trade_no二選一,若是同時存在優先級:transaction_id> out_trade_no * @param string $value **/ public function SetOut_trade_no($value) { $this->values['out_trade_no'] = $value; } /** * 獲取商戶系統內部的訂單號,transaction_id、out_trade_no二選一,若是同時存在優先級:transaction_id> out_trade_no的值 * @return 值 **/ public function GetOut_trade_no() { return $this->values['out_trade_no']; } /** * 判斷商戶系統內部的訂單號,transaction_id、out_trade_no二選一,若是同時存在優先級:transaction_id> out_trade_no是否存在 * @return true 或 false **/ public function IsOut_trade_noSet() { return array_key_exists('out_trade_no', $this->values); } /** * 設置商戶系統內部的退款單號,商戶系統內部惟一,同一退款單號屢次請求只退一筆 * @param string $value **/ public function SetOut_refund_no($value) { $this->values['out_refund_no'] = $value; } /** * 獲取商戶系統內部的退款單號,商戶系統內部惟一,同一退款單號屢次請求只退一筆的值 * @return 值 **/ public function GetOut_refund_no() { return $this->values['out_refund_no']; } /** * 判斷商戶系統內部的退款單號,商戶系統內部惟一,同一退款單號屢次請求只退一筆是否存在 * @return true 或 false **/ public function IsOut_refund_noSet() { return array_key_exists('out_refund_no', $this->values); } /** * 設置訂單總金額,單位爲分,只能爲整數,詳見支付金額 * @param string $value **/ public function SetTotal_fee($value) { $this->values['total_fee'] = $value; } /** * 獲取訂單總金額,單位爲分,只能爲整數,詳見支付金額的值 * @return 值 **/ public function GetTotal_fee() { return $this->values['total_fee']; } /** * 判斷訂單總金額,單位爲分,只能爲整數,詳見支付金額是否存在 * @return true 或 false **/ public function IsTotal_feeSet() { return array_key_exists('total_fee', $this->values); } /** * 設置退款總金額,訂單總金額,單位爲分,只能爲整數,詳見支付金額 * @param string $value **/ public function SetRefund_fee($value) { $this->values['refund_fee'] = $value; } /** * 獲取退款總金額,訂單總金額,單位爲分,只能爲整數,詳見支付金額的值 * @return 值 **/ public function GetRefund_fee() { return $this->values['refund_fee']; } /** * 判斷退款總金額,訂單總金額,單位爲分,只能爲整數,詳見支付金額是否存在 * @return true 或 false **/ public function IsRefund_feeSet() { return array_key_exists('refund_fee', $this->values); } /** * 設置貨幣類型,符合ISO 4217標準的三位字母代碼,默認人民幣:CNY,其餘值列表詳見貨幣類型 * @param string $value **/ public function SetRefund_fee_type($value) { $this->values['refund_fee_type'] = $value; } /** * 獲取貨幣類型,符合ISO 4217標準的三位字母代碼,默認人民幣:CNY,其餘值列表詳見貨幣類型的值 * @return 值 **/ public function GetRefund_fee_type() { return $this->values['refund_fee_type']; } /** * 判斷貨幣類型,符合ISO 4217標準的三位字母代碼,默認人民幣:CNY,其餘值列表詳見貨幣類型是否存在 * @return true 或 false **/ public function IsRefund_fee_typeSet() { return array_key_exists('refund_fee_type', $this->values); } /** * 設置操做員賬號, 默認爲商戶號 * @param string $value **/ public function SetOp_user_id($value) { $this->values['op_user_id'] = $value; } /** * 獲取操做員賬號, 默認爲商戶號的值 * @return 值 **/ public function GetOp_user_id() { return $this->values['op_user_id']; } /** * 判斷操做員賬號, 默認爲商戶號是否存在 * @return true 或 false **/ public function IsOp_user_idSet() { return array_key_exists('op_user_id', $this->values); } } /** * * 退款查詢輸入對象 * @author widyhu * */ class WxPayRefundQuery extends WxPayDataBase { /** * 設置微信分配的公衆帳號ID * @param string $value **/ public function SetAppid($value) { $this->values['appid'] = $value; } /** * 獲取微信分配的公衆帳號ID的值 * @return 值 **/ public function GetAppid() { return $this->values['appid']; } /** * 判斷微信分配的公衆帳號ID是否存在 * @return true 或 false **/ public function IsAppidSet() { return array_key_exists('appid', $this->values); } /** * 設置微信支付分配的商戶號 * @param string $value **/ public function SetMch_id($value) { $this->values['mch_id'] = $value; } /** * 獲取微信支付分配的商戶號的值 * @return 值 **/ public function GetMch_id() { return $this->values['mch_id']; } /** * 判斷微信支付分配的商戶號是否存在 * @return true 或 false **/ public function IsMch_idSet() { return array_key_exists('mch_id', $this->values); } /** * 設置微信支付分配的終端設備號 * @param string $value **/ public function SetDevice_info($value) { $this->values['device_info'] = $value; } /** * 獲取微信支付分配的終端設備號的值 * @return 值 **/ public function GetDevice_info() { return $this->values['device_info']; } /** * 判斷微信支付分配的終端設備號是否存在 * @return true 或 false **/ public function IsDevice_infoSet() { return array_key_exists('device_info', $this->values); } /** * 設置隨機字符串,不長於32位。推薦隨機數生成算法 * @param string $value **/ public function SetNonce_str($value) { $this->values['nonce_str'] = $value; } /** * 獲取隨機字符串,不長於32位。推薦隨機數生成算法的值 * @return 值 **/ public function GetNonce_str() { return $this->values['nonce_str']; } /** * 判斷隨機字符串,不長於32位。推薦隨機數生成算法是否存在 * @return true 或 false **/ public function IsNonce_strSet() { return array_key_exists('nonce_str', $this->values); } /** * 設置微信訂單號 * @param string $value **/ public function SetTransaction_id($value) { $this->values['transaction_id'] = $value; } /** * 獲取微信訂單號的值 * @return 值 **/ public function GetTransaction_id() { return $this->values['transaction_id']; } /** * 判斷微信訂單號是否存在 * @return true 或 false **/ public function IsTransaction_idSet() { return array_key_exists('transaction_id', $this->values); } /** * 設置商戶系統內部的訂單號 * @param string $value **/ public function SetOut_trade_no($value) { $this->values['out_trade_no'] = $value; } /** * 獲取商戶系統內部的訂單號的值 * @return 值 **/ public function GetOut_trade_no() { return $this->values['out_trade_no']; } /** * 判斷商戶系統內部的訂單號是否存在 * @return true 或 false **/ public function IsOut_trade_noSet() { return array_key_exists('out_trade_no', $this->values); } /** * 設置商戶退款單號 * @param string $value **/ public function SetOut_refund_no($value) { $this->values['out_refund_no'] = $value; } /** * 獲取商戶退款單號的值 * @return 值 **/ public function GetOut_refund_no() { return $this->values['out_refund_no']; } /** * 判斷商戶退款單號是否存在 * @return true 或 false **/ public function IsOut_refund_noSet() { return array_key_exists('out_refund_no', $this->values); } /** * 設置微信退款單號refund_id、out_refund_no、out_trade_no、transaction_id四個參數必填一個,若是同時存在優先級爲:refund_id>out_refund_no>transaction_id>out_trade_no * @param string $value **/ public function SetRefund_id($value) { $this->values['refund_id'] = $value; } /** * 獲取微信退款單號refund_id、out_refund_no、out_trade_no、transaction_id四個參數必填一個,若是同時存在優先級爲:refund_id>out_refund_no>transaction_id>out_trade_no的值 * @return 值 **/ public function GetRefund_id() { return $this->values['refund_id']; } /** * 判斷微信退款單號refund_id、out_refund_no、out_trade_no、transaction_id四個參數必填一個,若是同時存在優先級爲:refund_id>out_refund_no>transaction_id>out_trade_no是否存在 * @return true 或 false **/ public function IsRefund_idSet() { return array_key_exists('refund_id', $this->values); } } /** * * 下載對帳單輸入對象 * @author widyhu * */ class WxPayDownloadBill extends WxPayDataBase { /** * 設置微信分配的公衆帳號ID * @param string $value **/ public function SetAppid($value) { $this->values['appid'] = $value; } /** * 獲取微信分配的公衆帳號ID的值 * @return 值 **/ public function GetAppid() { return $this->values['appid']; } /** * 判斷微信分配的公衆帳號ID是否存在 * @return true 或 false **/ public function IsAppidSet() { return array_key_exists('appid', $this->values); } /** * 設置微信支付分配的商戶號 * @param string $value **/ public function SetMch_id($value) { $this->values['mch_id'] = $value; } /** * 獲取微信支付分配的商戶號的值 * @return 值 **/ public function GetMch_id() { return $this->values['mch_id']; } /** * 判斷微信支付分配的商戶號是否存在 * @return true 或 false **/ public function IsMch_idSet() { return array_key_exists('mch_id', $this->values); } /** * 設置微信支付分配的終端設備號,填寫此字段,只下載該設備號的對帳單 * @param string $value **/ public function SetDevice_info($value) { $this->values['device_info'] = $value; } /** * 獲取微信支付分配的終端設備號,填寫此字段,只下載該設備號的對帳單的值 * @return 值 **/ public function GetDevice_info() { return $this->values['device_info']; } /** * 判斷微信支付分配的終端設備號,填寫此字段,只下載該設備號的對帳單是否存在 * @return true 或 false **/ public function IsDevice_infoSet() { return array_key_exists('device_info', $this->values); } /** * 設置隨機字符串,不長於32位。推薦隨機數生成算法 * @param string $value **/ public function SetNonce_str($value) { $this->values['nonce_str'] = $value; } /** * 獲取隨機字符串,不長於32位。推薦隨機數生成算法的值 * @return 值 **/ public function GetNonce_str() { return $this->values['nonce_str']; } /** * 判斷隨機字符串,不長於32位。推薦隨機數生成算法是否存在 * @return true 或 false **/ public function IsNonce_strSet() { return array_key_exists('nonce_str', $this->values); } /** * 設置下載對帳單的日期,格式:20140603 * @param string $value **/ public function SetBill_date($value) { $this->values['bill_date'] = $value; } /** * 獲取下載對帳單的日期,格式:20140603的值 * @return 值 **/ public function GetBill_date() { return $this->values['bill_date']; } /** * 判斷下載對帳單的日期,格式:20140603是否存在 * @return true 或 false **/ public function IsBill_dateSet() { return array_key_exists('bill_date', $this->values); } /** * 設置ALL,返回當日全部訂單信息,默認值SUCCESS,返回當日成功支付的訂單REFUND,返回當日退款訂單REVOKED,已撤銷的訂單 * @param string $value **/ public function SetBill_type($value) { $this->values['bill_type'] = $value; } /** * 獲取ALL,返回當日全部訂單信息,默認值SUCCESS,返回當日成功支付的訂單REFUND,返回當日退款訂單REVOKED,已撤銷的訂單的值 * @return 值 **/ public function GetBill_type() { return $this->values['bill_type']; } /** * 判斷ALL,返回當日全部訂單信息,默認值SUCCESS,返回當日成功支付的訂單REFUND,返回當日退款訂單REVOKED,已撤銷的訂單是否存在 * @return true 或 false **/ public function IsBill_typeSet() { return array_key_exists('bill_type', $this->values); } } /** * * 測速上報輸入對象 * @author widyhu * */ class WxPayReport extends WxPayDataBase { /** * 設置微信分配的公衆帳號ID * @param string $value **/ public function SetAppid($value) { $this->values['appid'] = $value; } /** * 獲取微信分配的公衆帳號ID的值 * @return 值 **/ public function GetAppid() { return $this->values['appid']; } /** * 判斷微信分配的公衆帳號ID是否存在 * @return true 或 false **/ public function IsAppidSet() { return array_key_exists('appid', $this->values); } /** * 設置微信支付分配的商戶號 * @param string $value **/ public function SetMch_id($value) { $this->values['mch_id'] = $value; } /** * 獲取微信支付分配的商戶號的值 * @return 值 **/ public function GetMch_id() { return $this->values['mch_id']; } /** * 判斷微信支付分配的商戶號是否存在 * @return true 或 false **/ public function IsMch_idSet() { return array_key_exists('mch_id', $this->values); } /** * 設置微信支付分配的終端設備號,商戶自定義 * @param string $value **/ public function SetDevice_info($value) { $this->values['device_info'] = $value; } /** * 獲取微信支付分配的終端設備號,商戶自定義的值 * @return 值 **/ public function GetDevice_info() { return $this->values['device_info']; } /** * 判斷微信支付分配的終端設備號,商戶自定義是否存在 * @return true 或 false **/ public function IsDevice_infoSet() { return array_key_exists('device_info', $this->values); } /** * 設置隨機字符串,不長於32位。推薦隨機數生成算法 * @param string $value **/ public function SetNonce_str($value) { $this->values['nonce_str'] = $value; } /** * 獲取隨機字符串,不長於32位。推薦隨機數生成算法的值 * @return 值 **/ public function GetNonce_str() { return $this->values['nonce_str']; } /** * 判斷隨機字符串,不長於32位。推薦隨機數生成算法是否存在 * @return true 或 false **/ public function IsNonce_strSet() { return array_key_exists('nonce_str', $this->values); } /** * 設置上報對應的接口的完整URL,相似:https://api.mch.weixin.qq.com/pay/unifiedorder對於被掃支付,爲更好的和商戶共同分析一次業務行爲的總體耗時狀況,對於兩種接入模式,請都在門店側對一次被掃行爲進行一次單獨的總體上報,上報URL指定爲:https://api.mch.weixin.qq.com/pay/micropay/total關於兩種接入模式具體可參考本文檔章節:被掃支付商戶接入模式其它接口調用仍然按照調用一次,上報一次來進行。 * @param string $value **/ public function SetInterface_url($value) { $this->values['interface_url'] = $value; } /** * 獲取上報對應的接口的完整URL,相似:https://api.mch.weixin.qq.com/pay/unifiedorder對於被掃支付,爲更好的和商戶共同分析一次業務行爲的總體耗時狀況,對於兩種接入模式,請都在門店側對一次被掃行爲進行一次單獨的總體上報,上報URL指定爲:https://api.mch.weixin.qq.com/pay/micropay/total關於兩種接入模式具體可參考本文檔章節:被掃支付商戶接入模式其它接口調用仍然按照調用一次,上報一次來進行。的值 * @return 值 **/ public function GetInterface_url() { return $this->values['interface_url']; } /** * 判斷上報對應的接口的完整URL,相似:https://api.mch.weixin.qq.com/pay/unifiedorder對於被掃支付,爲更好的和商戶共同分析一次業務行爲的總體耗時狀況,對於兩種接入模式,請都在門店側對一次被掃行爲進行一次單獨的總體上報,上報URL指定爲:https://api.mch.weixin.qq.com/pay/micropay/total關於兩種接入模式具體可參考本文檔章節:被掃支付商戶接入模式其它接口調用仍然按照調用一次,上報一次來進行。是否存在 * @return true 或 false **/ public function IsInterface_urlSet() { return array_key_exists('interface_url', $this->values); } /** * 設置接口耗時狀況,單位爲毫秒 * @param string $value **/ public function SetExecute_time_($value) { $this->values['execute_time_'] = $value; } /** * 獲取接口耗時狀況,單位爲毫秒的值 * @return 值 **/ public function GetExecute_time_() { return $this->values['execute_time_']; } /** * 判斷接口耗時狀況,單位爲毫秒是否存在 * @return true 或 false **/ public function IsExecute_time_Set() { return array_key_exists('execute_time_', $this->values); } /** * 設置SUCCESS/FAIL此字段是通訊標識,非交易標識,交易是否成功須要查看trade_state來判斷 * @param string $value **/ public function SetReturn_code($value) { $this->values['return_code'] = $value; } /** * 獲取SUCCESS/FAIL此字段是通訊標識,非交易標識,交易是否成功須要查看trade_state來判斷的值 * @return 值 **/ public function GetReturn_code() { return $this->values['return_code']; } /** * 判斷SUCCESS/FAIL此字段是通訊標識,非交易標識,交易是否成功須要查看trade_state來判斷是否存在 * @return true 或 false **/ public function IsReturn_codeSet() { return array_key_exists('return_code', $this->values); } /** * 設置返回信息,如非空,爲錯誤緣由簽名失敗參數格式校驗錯誤 * @param string $value **/ public function SetReturn_msg($value) { $this->values['return_msg'] = $value; } /** * 獲取返回信息,如非空,爲錯誤緣由簽名失敗參數格式校驗錯誤的值 * @return 值 **/ public function GetReturn_msg() { return $this->values['return_msg']; } /** * 判斷返回信息,如非空,爲錯誤緣由簽名失敗參數格式校驗錯誤是否存在 * @return true 或 false **/ public function IsReturn_msgSet() { return array_key_exists('return_msg', $this->values); } /** * 設置SUCCESS/FAIL * @param string $value **/ public function SetResult_code($value) { $this->values['result_code'] = $value; } /** * 獲取SUCCESS/FAIL的值 * @return 值 **/ public function GetResult_code() { return $this->values['result_code']; } /** * 判斷SUCCESS/FAIL是否存在 * @return true 或 false **/ public function IsResult_codeSet() { return array_key_exists('result_code', $this->values); } /** * 設置ORDERNOTEXIST—訂單不存在SYSTEMERROR—系統錯誤 * @param string $value **/ public function SetErr_code($value) { $this->values['err_code'] = $value; } /** * 獲取ORDERNOTEXIST—訂單不存在SYSTEMERROR—系統錯誤的值 * @return 值 **/ public function GetErr_code() { return $this->values['err_code']; } /** * 判斷ORDERNOTEXIST—訂單不存在SYSTEMERROR—系統錯誤是否存在 * @return true 或 false **/ public function IsErr_codeSet() { return array_key_exists('err_code', $this->values); } /** * 設置結果信息描述 * @param string $value **/ public function SetErr_code_des($value) { $this->values['err_code_des'] = $value; } /** * 獲取結果信息描述的值 * @return 值 **/ public function GetErr_code_des() { return $this->values['err_code_des']; } /** * 判斷結果信息描述是否存在 * @return true 或 false **/ public function IsErr_code_desSet() { return array_key_exists('err_code_des', $this->values); } /** * 設置商戶系統內部的訂單號,商戶能夠在上報時提供相關商戶訂單號方便微信支付更好的提升服務質量。 * @param string $value **/ public function SetOut_trade_no($value) { $this->values['out_trade_no'] = $value; } /** * 獲取商戶系統內部的訂單號,商戶能夠在上報時提供相關商戶訂單號方便微信支付更好的提升服務質量。 的值 * @return 值 **/ public function GetOut_trade_no() { return $this->values['out_trade_no']; } /** * 判斷商戶系統內部的訂單號,商戶能夠在上報時提供相關商戶訂單號方便微信支付更好的提升服務質量。 是否存在 * @return true 或 false **/ public function IsOut_trade_noSet() { return array_key_exists('out_trade_no', $this->values); } /** * 設置發起接口調用時的機器IP * @param string $value **/ public function SetUser_ip($value) { $this->values['user_ip'] = $value; } /** * 獲取發起接口調用時的機器IP 的值 * @return 值 **/ public function GetUser_ip() { return $this->values['user_ip']; } /** * 判斷髮起接口調用時的機器IP 是否存在 * @return true 或 false **/ public function IsUser_ipSet() { return array_key_exists('user_ip', $this->values); } /** * 設置系統時間,格式爲yyyyMMddHHmmss,如2009年12月27日9點10分10秒錶示爲20091227091010。其餘詳見時間規則 * @param string $value **/ public function SetTime($value) { $this->values['time'] = $value; } /** * 獲取系統時間,格式爲yyyyMMddHHmmss,如2009年12月27日9點10分10秒錶示爲20091227091010。其餘詳見時間規則的值 * @return 值 **/ public function GetTime() { return $this->values['time']; } /** * 判斷系統時間,格式爲yyyyMMddHHmmss,如2009年12月27日9點10分10秒錶示爲20091227091010。其餘詳見時間規則是否存在 * @return true 或 false **/ public function IsTimeSet() { return array_key_exists('time', $this->values); } } /** * * 短鏈轉換輸入對象 * @author widyhu * */ class WxPayShortUrl extends WxPayDataBase { /** * 設置微信分配的公衆帳號ID * @param string $value **/ public function SetAppid($value) { $this->values['appid'] = $value; } /** * 獲取微信分配的公衆帳號ID的值 * @return 值 **/ public function GetAppid() { return $this->values['appid']; } /** * 判斷微信分配的公衆帳號ID是否存在 * @return true 或 false **/ public function IsAppidSet() { return array_key_exists('appid', $this->values); } /** * 設置微信支付分配的商戶號 * @param string $value **/ public function SetMch_id($value) { $this->values['mch_id'] = $value; } /** * 獲取微信支付分配的商戶號的值 * @return 值 **/ public function GetMch_id() { return $this->values['mch_id']; } /** * 判斷微信支付分配的商戶號是否存在 * @return true 或 false **/ public function IsMch_idSet() { return array_key_exists('mch_id', $this->values); } /** * 設置須要轉換的URL,簽名用原串,傳輸需URL encode * @param string $value **/ public function SetLong_url($value) { $this->values['long_url'] = $value; } /** * 獲取須要轉換的URL,簽名用原串,傳輸需URL encode的值 * @return 值 **/ public function GetLong_url() { return $this->values['long_url']; } /** * 判斷須要轉換的URL,簽名用原串,傳輸需URL encode是否存在 * @return true 或 false **/ public function IsLong_urlSet() { return array_key_exists('long_url', $this->values); } /** * 設置隨機字符串,不長於32位。推薦隨機數生成算法 * @param string $value **/ public function SetNonce_str($value) { $this->values['nonce_str'] = $value; } /** * 獲取隨機字符串,不長於32位。推薦隨機數生成算法的值 * @return 值 **/ public function GetNonce_str() { return $this->values['nonce_str']; } /** * 判斷隨機字符串,不長於32位。推薦隨機數生成算法是否存在 * @return true 或 false **/ public function IsNonce_strSet() { return array_key_exists('nonce_str', $this->values); } } /** * * 提交被掃輸入對象 * @author widyhu * */ class WxPayMicroPay extends WxPayDataBase { /** * 設置微信分配的公衆帳號ID * @param string $value **/ public function SetAppid($value) { $this->values['appid'] = $value; } /** * 獲取微信分配的公衆帳號ID的值 * @return 值 **/ public function GetAppid() { return $this->values['appid']; } /** * 判斷微信分配的公衆帳號ID是否存在 * @return true 或 false **/ public function IsAppidSet() { return array_key_exists('appid', $this->values); } /** * 設置微信支付分配的商戶號 * @param string $value **/ public function SetMch_id($value) { $this->values['mch_id'] = $value; } /** * 獲取微信支付分配的商戶號的值 * @return 值 **/ public function GetMch_id() { return $this->values['mch_id']; } /** * 判斷微信支付分配的商戶號是否存在 * @return true 或 false **/ public function IsMch_idSet() { return array_key_exists('mch_id', $this->values); } /** * 設置終端設備號(商戶自定義,如門店編號) * @param string $value **/ public function SetDevice_info($value) { $this->values['device_info'] = $value; } /** * 獲取終端設備號(商戶自定義,如門店編號)的值 * @return 值 **/ public function GetDevice_info() { return $this->values['device_info']; } /** * 判斷終端設備號(商戶自定義,如門店編號)是否存在 * @return true 或 false **/ public function IsDevice_infoSet() { return array_key_exists('device_info', $this->values); } /** * 設置隨機字符串,不長於32位。推薦隨機數生成算法 * @param string $value **/ public function SetNonce_str($value) { $this->values['nonce_str'] = $value; } /** * 獲取隨機字符串,不長於32位。推薦隨機數生成算法的值 * @return 值 **/ public function GetNonce_str() { return $this->values['nonce_str']; } /** * 判斷隨機字符串,不長於32位。推薦隨機數生成算法是否存在 * @return true 或 false **/ public function IsNonce_strSet() { return array_key_exists('nonce_str', $this->values); } /** * 設置商品或支付單簡要描述 * @param string $value **/ public function SetBody($value) { $this->values['body'] = $value; } /** * 獲取商品或支付單簡要描述的值 * @return 值 **/ public function GetBody() { return $this->values['body']; } /** * 判斷商品或支付單簡要描述是否存在 * @return true 或 false **/ public function IsBodySet() { return array_key_exists('body', $this->values); } /** * 設置商品名稱明細列表 * @param string $value **/ public function SetDetail($value) { $this->values['detail'] = $value; } /** * 獲取商品名稱明細列表的值 * @return 值 **/ public function GetDetail() { return $this->values['detail']; } /** * 判斷商品名稱明細列表是否存在 * @return true 或 false **/ public function IsDetailSet() { return array_key_exists('detail', $this->values); } /** * 設置附加數據,在查詢API和支付通知中原樣返回,該字段主要用於商戶攜帶訂單的自定義數據 * @param string $value **/ public function SetAttach($value) { $this->values['attach'] = $value; } /** * 獲取附加數據,在查詢API和支付通知中原樣返回,該字段主要用於商戶攜帶訂單的自定義數據的值 * @return 值 **/ public function GetAttach() { return $this->values['attach']; } /** * 判斷附加數據,在查詢API和支付通知中原樣返回,該字段主要用於商戶攜帶訂單的自定義數據是否存在 * @return true 或 false **/ public function IsAttachSet() { return array_key_exists('attach', $this->values); } /** * 設置商戶系統內部的訂單號,32個字符內、可包含字母, 其餘說明見商戶訂單號 * @param string $value **/ public function SetOut_trade_no($value) { $this->values['out_trade_no'] = $value; } /** * 獲取商戶系統內部的訂單號,32個字符內、可包含字母, 其餘說明見商戶訂單號的值 * @return 值 **/ public function GetOut_trade_no() { return $this->values['out_trade_no']; } /** * 判斷商戶系統內部的訂單號,32個字符內、可包含字母, 其餘說明見商戶訂單號是否存在 * @return true 或 false **/ public function IsOut_trade_noSet() { return array_key_exists('out_trade_no', $this->values); } /** * 設置訂單總金額,單位爲分,只能爲整數,詳見支付金額 * @param string $value **/ public function SetTotal_fee($value) { $this->values['total_fee'] = $value; } /** * 獲取訂單總金額,單位爲分,只能爲整數,詳見支付金額的值 * @return 值 **/ public function GetTotal_fee() { return $this->values['total_fee']; } /** * 判斷訂單總金額,單位爲分,只能爲整數,詳見支付金額是否存在 * @return true 或 false **/ public function IsTotal_feeSet() { return array_key_exists('total_fee', $this->values); } /** * 設置符合ISO 4217標準的三位字母代碼,默認人民幣:CNY,其餘值列表詳見貨幣類型 * @param string $value **/ public function SetFee_type($value) { $this->values['fee_type'] = $value; } /** * 獲取符合ISO 4217標準的三位字母代碼,默認人民幣:CNY,其餘值列表詳見貨幣類型的值 * @return 值 **/ public function GetFee_type() { return $this->values['fee_type']; } /** * 判斷符合ISO 4217標準的三位字母代碼,默認人民幣:CNY,其餘值列表詳見貨幣類型是否存在 * @return true 或 false **/ public function IsFee_typeSet() { return array_key_exists('fee_type', $this->values); } /** * 設置調用微信支付API的機器IP * @param string $value **/ public function SetSpbill_create_ip($value) { $this->values['spbill_create_ip'] = $value; } /** * 獲取調用微信支付API的機器IP 的值 * @return 值 **/ public function GetSpbill_create_ip() { return $this->values['spbill_create_ip']; } /** * 判斷調用微信支付API的機器IP 是否存在 * @return true 或 false **/ public function IsSpbill_create_ipSet() { return array_key_exists('spbill_create_ip', $this->values); } /** * 設置訂單生成時間,格式爲yyyyMMddHHmmss,如2009年12月25日9點10分10秒錶示爲20091225091010。詳見時間規則 * @param string $value **/ public function SetTime_start($value) { $this->values['time_start'] = $value; } /** * 獲取訂單生成時間,格式爲yyyyMMddHHmmss,如2009年12月25日9點10分10秒錶示爲20091225091010。詳見時間規則的值 * @return 值 **/ public function GetTime_start() { return $this->values['time_start']; } /** * 判斷訂單生成時間,格式爲yyyyMMddHHmmss,如2009年12月25日9點10分10秒錶示爲20091225091010。詳見時間規則是否存在 * @return true 或 false **/ public function IsTime_startSet() { return array_key_exists('time_start', $this->values); } /** * 設置訂單失效時間,格式爲yyyyMMddHHmmss,如2009年12月27日9點10分10秒錶示爲20091227091010。詳見時間規則 * @param string $value **/ public function SetTime_expire($value) { $this->values['time_expire'] = $value; } /** * 獲取訂單失效時間,格式爲yyyyMMddHHmmss,如2009年12月27日9點10分10秒錶示爲20091227091010。詳見時間規則的值 * @return 值 **/ public function GetTime_expire() { return $this->values['time_expire']; } /** * 判斷訂單失效時間,格式爲yyyyMMddHHmmss,如2009年12月27日9點10分10秒錶示爲20091227091010。詳見時間規則是否存在 * @return true 或 false **/ public function IsTime_expireSet() { return array_key_exists('time_expire', $this->values); } /** * 設置商品標記,代金券或立減優惠功能的參數,說明詳見代金券或立減優惠 * @param string $value **/ public function SetGoods_tag($value) { $this->values['goods_tag'] = $value; } /** * 獲取商品標記,代金券或立減優惠功能的參數,說明詳見代金券或立減優惠的值 * @return 值 **/ public function GetGoods_tag() { return $this->values['goods_tag']; } /** * 判斷商品標記,代金券或立減優惠功能的參數,說明詳見代金券或立減優惠是否存在 * @return true 或 false **/ public function IsGoods_tagSet() { return array_key_exists('goods_tag', $this->values); } /** * 設置掃碼支付受權碼,設備讀取用戶微信中的條碼或者二維碼信息 * @param string $value **/ public function SetAuth_code($value) { $this->values['auth_code'] = $value; } /** * 獲取掃碼支付受權碼,設備讀取用戶微信中的條碼或者二維碼信息的值 * @return 值 **/ public function GetAuth_code() { return $this->values['auth_code']; } /** * 判斷掃碼支付受權碼,設備讀取用戶微信中的條碼或者二維碼信息是否存在 * @return true 或 false **/ public function IsAuth_codeSet() { return array_key_exists('auth_code', $this->values); } } /** * * 撤銷輸入對象 * @author widyhu * */ class WxPayReverse extends WxPayDataBase { /** * 設置微信分配的公衆帳號ID * @param string $value **/ public function SetAppid($value) { $this->values['appid'] = $value; } /** * 獲取微信分配的公衆帳號ID的值 * @return 值 **/ public function GetAppid() { return $this->values['appid']; } /** * 判斷微信分配的公衆帳號ID是否存在 * @return true 或 false **/ public function IsAppidSet() { return array_key_exists('appid', $this->values); } /** * 設置微信支付分配的商戶號 * @param string $value **/ public function SetMch_id($value) { $this->values['mch_id'] = $value; } /** * 獲取微信支付分配的商戶號的值 * @return 值 **/ public function GetMch_id() { return $this->values['mch_id']; } /** * 判斷微信支付分配的商戶號是否存在 * @return true 或 false **/ public function IsMch_idSet() { return array_key_exists('mch_id', $this->values); } /** * 設置微信的訂單號,優先使用 * @param string $value **/ public function SetTransaction_id($value) { $this->values['transaction_id'] = $value; } /** * 獲取微信的訂單號,優先使用的值 * @return 值 **/ public function GetTransaction_id() { return $this->values['transaction_id']; } /** * 判斷微信的訂單號,優先使用是否存在 * @return true 或 false **/ public function IsTransaction_idSet() { return array_key_exists('transaction_id', $this->values); } /** * 設置商戶系統內部的訂單號,transaction_id、out_trade_no二選一,若是同時存在優先級:transaction_id> out_trade_no * @param string $value **/ public function SetOut_trade_no($value) { $this->values['out_trade_no'] = $value; } /** * 獲取商戶系統內部的訂單號,transaction_id、out_trade_no二選一,若是同時存在優先級:transaction_id> out_trade_no的值 * @return 值 **/ public function GetOut_trade_no() { return $this->values['out_trade_no']; } /** * 判斷商戶系統內部的訂單號,transaction_id、out_trade_no二選一,若是同時存在優先級:transaction_id> out_trade_no是否存在 * @return true 或 false **/ public function IsOut_trade_noSet() { return array_key_exists('out_trade_no', $this->values); } /** * 設置隨機字符串,不長於32位。推薦隨機數生成算法 * @param string $value **/ public function SetNonce_str($value) { $this->values['nonce_str'] = $value; } /** * 獲取隨機字符串,不長於32位。推薦隨機數生成算法的值 * @return 值 **/ public function GetNonce_str() { return $this->values['nonce_str']; } /** * 判斷隨機字符串,不長於32位。推薦隨機數生成算法是否存在 * @return true 或 false **/ public function IsNonce_strSet() { return array_key_exists('nonce_str', $this->values); } } /** * * 提交JSAPI輸入對象 * @author widyhu * */ class WxPayJsApiPay extends WxPayDataBase { /** * 設置微信分配的公衆帳號ID * @param string $value **/ public function SetAppid($value) { $this->values['appId'] = $value; } /** * 獲取微信分配的公衆帳號ID的值 * @return 值 **/ public function GetAppid() { return $this->values['appId']; } /** * 判斷微信分配的公衆帳號ID是否存在 * @return true 或 false **/ public function IsAppidSet() { return array_key_exists('appId', $this->values); } /** * 設置支付時間戳 * @param string $value **/ public function SetTimeStamp($value) { $this->values['timeStamp'] = (string)$value; } /** * 獲取支付時間戳的值 * @return 值 **/ public function GetTimeStamp() { return $this->values['timeStamp']; } /** * 判斷支付時間戳是否存在 * @return true 或 false **/ public function IsTimeStampSet() { return array_key_exists('timeStamp', $this->values); } /** * 隨機字符串 * @param string $value **/ public function SetNonceStr($value) { $this->values['nonceStr'] = $value; } /** * 獲取notify隨機字符串值 * @return 值 **/ public function GetReturn_code() { return $this->values['nonceStr']; } /** * 判斷隨機字符串是否存在 * @return true 或 false **/ public function IsReturn_codeSet() { return array_key_exists('nonceStr', $this->values); } /** * 設置訂單詳情擴展字符串 * @param string $value **/ public function SetPackage($value) { $this->values['package'] = $value; } /** * 獲取訂單詳情擴展字符串的值 * @return 值 **/ public function GetPackage() { return $this->values['package']; } /** * 判斷訂單詳情擴展字符串是否存在 * @return true 或 false **/ public function IsPackageSet() { return array_key_exists('package', $this->values); } /** * 設置簽名方式 * @param string $value **/ public function SetSignType($value) { $this->values['signType'] = $value; } /** * 獲取簽名方式 * @return 值 **/ public function GetSignType() { return $this->values['signType']; } /** * 判斷簽名方式是否存在 * @return true 或 false **/ public function IsSignTypeSet() { return array_key_exists('signType', $this->values); } /** * 設置簽名方式 * @param string $value **/ public function SetPaySign($value) { $this->values['paySign'] = $value; } /** * 獲取簽名方式 * @return 值 **/ public function GetPaySign() { return $this->values['paySign']; } /** * 判斷簽名方式是否存在 * @return true 或 false **/ public function IsPaySignSet() { return array_key_exists('paySign', $this->values); } } /** * * 掃碼支付模式一輩子成二維碼參數 * @author widyhu * */ class WxPayBizPayUrl extends WxPayDataBase { /** * 設置微信分配的公衆帳號ID * @param string $value **/ public function SetAppid($value) { $this->values['appid'] = $value; } /** * 獲取微信分配的公衆帳號ID的值 * @return 值 **/ public function GetAppid() { return $this->values['appid']; } /** * 判斷微信分配的公衆帳號ID是否存在 * @return true 或 false **/ public function IsAppidSet() { return array_key_exists('appid', $this->values); } /** * 設置微信支付分配的商戶號 * @param string $value **/ public function SetMch_id($value) { $this->values['mch_id'] = $value; } /** * 獲取微信支付分配的商戶號的值 * @return 值 **/ public function GetMch_id() { return $this->values['mch_id']; } /** * 判斷微信支付分配的商戶號是否存在 * @return true 或 false **/ public function IsMch_idSet() { return array_key_exists('mch_id', $this->values); } /** * 設置支付時間戳 * @param string $value **/ public function SetTime_stamp($value) { $this->values['time_stamp'] = $value; } /** * 獲取支付時間戳的值 * @return 值 **/ public function GetTime_stamp() { return $this->values['time_stamp']; } /** * 判斷支付時間戳是否存在 * @return true 或 false **/ public function IsTime_stampSet() { return array_key_exists('time_stamp', $this->values); } /** * 設置隨機字符串 * @param string $value **/ public function SetNonce_str($value) { $this->values['nonce_str'] = $value; } /** * 獲取隨機字符串的值 * @return 值 **/ public function GetNonce_str() { return $this->values['nonce_str']; } /** * 判斷隨機字符串是否存在 * @return true 或 false **/ public function IsNonce_strSet() { return array_key_exists('nonce_str', $this->values); } /** * 設置商品ID * @param string $value **/ public function SetProduct_id($value) { $this->values['product_id'] = $value; } /** * 獲取商品ID的值 * @return 值 **/ public function GetProduct_id() { return $this->values['product_id']; } /** * 判斷商品ID是否存在 * @return true 或 false **/ public function IsProduct_idSet() { return array_key_exists('product_id', $this->values); } }
$response = self::postXmlCurl($xml, $url, false, $timeOut);
26 curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//嚴格校驗
---> curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);//2017-03-01
1 CODE 2 3 /** 4 * 以post方式提交xml到對應的接口url 5 * 6 * @param string $xml 須要post的xml數據 7 * @param string $url url 8 * @param bool $useCert 是否須要證書,默認不須要 9 * @param int $second url執行超時時間,默認30s 10 * @throws WxPayException 11 */ 12 private static function postXmlCurl($xml, $url, $useCert = false, $second = 30) 13 { 14 $ch = curl_init(); 15 //設置超時 16 curl_setopt($ch, CURLOPT_TIMEOUT, $second); 17 18 //若是有配置代理這裏就設置代理 19 if(WxPayConfig::CURL_PROXY_HOST != "0.0.0.0" 20 && WxPayConfig::CURL_PROXY_PORT != 0){ 21 curl_setopt($ch,CURLOPT_PROXY, WxPayConfig::CURL_PROXY_HOST); 22 curl_setopt($ch,CURLOPT_PROXYPORT, WxPayConfig::CURL_PROXY_PORT); 23 } 24 curl_setopt($ch,CURLOPT_URL, $url); 25 curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE); 26 curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//嚴格校驗 27 //設置header 28 curl_setopt($ch, CURLOPT_HEADER, FALSE); 29 //要求結果爲字符串且輸出到屏幕上 30 curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 31 32 if($useCert == true){ 33 //設置證書 34 //使用證書:cert 與 key 分別屬於兩個.pem文件 35 curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM'); 36 curl_setopt($ch,CURLOPT_SSLCERT, WxPayConfig::SSLCERT_PATH); 37 curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM'); 38 curl_setopt($ch,CURLOPT_SSLKEY, WxPayConfig::SSLKEY_PATH); 39 } 40 //post提交方式 41 curl_setopt($ch, CURLOPT_POST, TRUE); 42 curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); 43 //運行curl 44 $data = curl_exec($ch); 45 //返回結果 46 if($data){ 47 curl_close($ch); 48 return $data; 49 } else { 50 $error = curl_errno($ch); 51 curl_close($ch); 52 throw new WxPayException("curl出錯,錯誤碼:$error"); 53 } 54 } 55
CODE <?php ini_set('date.timezone','Asia/Shanghai'); //error_reporting(E_ERROR); require_once "../lib/WxPay.Api.php"; require_once "WxPay.JsApiPay.php"; require_once 'log.php'; //初始化日誌 $logHandler= new CLogFileHandler("../logs/".date('Y-m-d').'.log'); $log = Log::Init($logHandler, 15); //打印輸出數組信息 function printf_info($data) { foreach($data as $key=>$value){ echo "<font color='#00ff55;'>$key</font> : $value <br/>"; } } //①、獲取用戶openid $tools = new JsApiPay(); //$openId = $tools->GetOpenid(); //var_dump($openId); // //var_dump($_REQUEST); //die(); $openId ='owwwwwwwwwwwwSE'; //②、統一下單 $input = new WxPayUnifiedOrder(); $input->SetBody("test"); $input->SetAttach("test"); $input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis")); $input->SetTotal_fee("1"); $input->SetTime_start(date("YmdHis")); $input->SetTime_expire(date("YmdHis", time() + 600)); $input->SetGoods_tag("test"); $input->SetNotify_url("http://www.w.cn/w/example/notify.php"); $input->SetTrade_type("JSAPI"); $input->SetOpenid($openId); var_dump($input); $order = WxPayApi::unifiedOrder($input); var_dump($order); echo '<font color="#f00"><b>統一下單支付單信息</b></font><br/>'; printf_info($order); $jsApiParameters = $tools->GetJsApiParameters($order);
CODE <?php require_once "WxPay.Exception.php"; require_once "WxPay.Config.php"; require_once "WxPay.Data.php"; /** * * 接口訪問類,包含全部微信支付API列表的封裝,類中方法爲static方法, * 每一個接口有默認超時時間(除提交被掃支付爲10s,上報超時時間爲1s外,其餘均爲6s) * @author widyhu * */ class WxPayApi { /** * * 統一下單,WxPayUnifiedOrder中out_trade_no、body、total_fee、trade_type必填 * appid、mchid、spbill_create_ip、nonce_str不須要填入 * @param WxPayUnifiedOrder $inputObj * @param int $timeOut * @throws WxPayException * @return 成功時返回,其餘拋異常 */ public static function unifiedOrder($inputObj, $timeOut = 6) { $url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; //檢測必填參數 if(!$inputObj->IsOut_trade_noSet()) { throw new WxPayException("缺乏統一支付接口必填參數out_trade_no!"); }else if(!$inputObj->IsBodySet()){ throw new WxPayException("缺乏統一支付接口必填參數body!"); }else if(!$inputObj->IsTotal_feeSet()) { throw new WxPayException("缺乏統一支付接口必填參數total_fee!"); }else if(!$inputObj->IsTrade_typeSet()) { throw new WxPayException("缺乏統一支付接口必填參數trade_type!"); } //關聯參數 if($inputObj->GetTrade_type() == "JSAPI" && !$inputObj->IsOpenidSet()){ throw new WxPayException("統一支付接口中,缺乏必填參數openid!trade_type爲JSAPI時,openid爲必填參數!"); } if($inputObj->GetTrade_type() == "NATIVE" && !$inputObj->IsProduct_idSet()){ throw new WxPayException("統一支付接口中,缺乏必填參數product_id!trade_type爲JSAPI時,product_id爲必填參數!"); } //異步通知url未設置,則使用配置文件中的url if(!$inputObj->IsNotify_urlSet()){ $inputObj->SetNotify_url(WxPayConfig::NOTIFY_URL);//異步通知url } $inputObj->SetAppid(WxPayConfig::APPID);//公衆帳號ID $inputObj->SetMch_id(WxPayConfig::MCHID);//商戶號 $inputObj->SetSpbill_create_ip($_SERVER['REMOTE_ADDR']);//終端ip //$inputObj->SetSpbill_create_ip("1.1.1.1"); $inputObj->SetNonce_str(self::getNonceStr());//隨機字符串 //簽名 $inputObj->SetSign(); $xml = $inputObj->ToXml(); $startTimeStamp = self::getMillisecond();//請求開始時間 return 14963; die(); $response = self::postXmlCurl($xml, $url, false, $timeOut); $result = WxPayResults::Init($response); self::reportCostTime($url, $startTimeStamp, $result);//上報請求花費時間 return $result; } /** * * 查詢訂單,WxPayOrderQuery中out_trade_no、transaction_id至少填一個 * appid、mchid、spbill_create_ip、nonce_str不須要填入 * @param WxPayOrderQuery $inputObj * @param int $timeOut * @throws WxPayException * @return 成功時返回,其餘拋異常 */ public static function orderQuery($inputObj, $timeOut = 6) { $url = "https://api.mch.weixin.qq.com/pay/orderquery"; //檢測必填參數 if(!$inputObj->IsOut_trade_noSet() && !$inputObj->IsTransaction_idSet()) { throw new WxPayException("訂單查詢接口中,out_trade_no、transaction_id至少填一個!"); } $inputObj->SetAppid(WxPayConfig::APPID);//公衆帳號ID $inputObj->SetMch_id(WxPayConfig::MCHID);//商戶號 $inputObj->SetNonce_str(self::getNonceStr());//隨機字符串 $inputObj->SetSign();//簽名 $xml = $inputObj->ToXml(); $startTimeStamp = self::getMillisecond();//請求開始時間 $response = self::postXmlCurl($xml, $url, false, $timeOut); $result = WxPayResults::Init($response); self::reportCostTime($url, $startTimeStamp, $result);//上報請求花費時間 return $result; } /** * * 關閉訂單,WxPayCloseOrder中out_trade_no必填 * appid、mchid、spbill_create_ip、nonce_str不須要填入 * @param WxPayCloseOrder $inputObj * @param int $timeOut * @throws WxPayException * @return 成功時返回,其餘拋異常 */ public static function closeOrder($inputObj, $timeOut = 6) { $url = "https://api.mch.weixin.qq.com/pay/closeorder"; //檢測必填參數 if(!$inputObj->IsOut_trade_noSet()) { throw new WxPayException("訂單查詢接口中,out_trade_no必填!"); } $inputObj->SetAppid(WxPayConfig::APPID);//公衆帳號ID $inputObj->SetMch_id(WxPayConfig::MCHID);//商戶號 $inputObj->SetNonce_str(self::getNonceStr());//隨機字符串 $inputObj->SetSign();//簽名 $xml = $inputObj->ToXml(); $startTimeStamp = self::getMillisecond();//請求開始時間 $response = self::postXmlCurl($xml, $url, false, $timeOut); $result = WxPayResults::Init($response); self::reportCostTime($url, $startTimeStamp, $result);//上報請求花費時間 return $result; } /** * * 申請退款,WxPayRefund中out_trade_no、transaction_id至少填一個且 * out_refund_no、total_fee、refund_fee、op_user_id爲必填參數 * appid、mchid、spbill_create_ip、nonce_str不須要填入 * @param WxPayRefund $inputObj * @param int $timeOut * @throws WxPayException * @return 成功時返回,其餘拋異常 */ public static function refund($inputObj, $timeOut = 6) { $url = "https://api.mch.weixin.qq.com/secapi/pay/refund"; //檢測必填參數 if(!$inputObj->IsOut_trade_noSet() && !$inputObj->IsTransaction_idSet()) { throw new WxPayException("退款申請接口中,out_trade_no、transaction_id至少填一個!"); }else if(!$inputObj->IsOut_refund_noSet()){ throw new WxPayException("退款申請接口中,缺乏必填參數out_refund_no!"); }else if(!$inputObj->IsTotal_feeSet()){ throw new WxPayException("退款申請接口中,缺乏必填參數total_fee!"); }else if(!$inputObj->IsRefund_feeSet()){ throw new WxPayException("退款申請接口中,缺乏必填參數refund_fee!"); }else if(!$inputObj->IsOp_user_idSet()){ throw new WxPayException("退款申請接口中,缺乏必填參數op_user_id!"); } $inputObj->SetAppid(WxPayConfig::APPID);//公衆帳號ID $inputObj->SetMch_id(WxPayConfig::MCHID);//商戶號 $inputObj->SetNonce_str(self::getNonceStr());//隨機字符串 $inputObj->SetSign();//簽名 $xml = $inputObj->ToXml(); $startTimeStamp = self::getMillisecond();//請求開始時間 $response = self::postXmlCurl($xml, $url, true, $timeOut); $result = WxPayResults::Init($response); self::reportCostTime($url, $startTimeStamp, $result);//上報請求花費時間 return $result; } /** * * 查詢退款 * 提交退款申請後,經過調用該接口查詢退款狀態。退款有必定延時, * 用零錢支付的退款20分鐘內到帳,銀行卡支付的退款3個工做往後從新查詢退款狀態。 * WxPayRefundQuery中out_refund_no、out_trade_no、transaction_id、refund_id四個參數必填一個 * appid、mchid、spbill_create_ip、nonce_str不須要填入 * @param WxPayRefundQuery $inputObj * @param int $timeOut * @throws WxPayException * @return 成功時返回,其餘拋異常 */ public static function refundQuery($inputObj, $timeOut = 6) { $url = "https://api.mch.weixin.qq.com/pay/refundquery"; //檢測必填參數 if(!$inputObj->IsOut_refund_noSet() && !$inputObj->IsOut_trade_noSet() && !$inputObj->IsTransaction_idSet() && !$inputObj->IsRefund_idSet()) { throw new WxPayException("退款查詢接口中,out_refund_no、out_trade_no、transaction_id、refund_id四個參數必填一個!"); } $inputObj->SetAppid(WxPayConfig::APPID);//公衆帳號ID $inputObj->SetMch_id(WxPayConfig::MCHID);//商戶號 $inputObj->SetNonce_str(self::getNonceStr());//隨機字符串 $inputObj->SetSign();//簽名 $xml = $inputObj->ToXml(); $startTimeStamp = self::getMillisecond();//請求開始時間 $response = self::postXmlCurl($xml, $url, false, $timeOut); $result = WxPayResults::Init($response); self::reportCostTime($url, $startTimeStamp, $result);//上報請求花費時間 return $result; } /** * 下載對帳單,WxPayDownloadBill中bill_date爲必填參數 * appid、mchid、spbill_create_ip、nonce_str不須要填入 * @param WxPayDownloadBill $inputObj * @param int $timeOut * @throws WxPayException * @return 成功時返回,其餘拋異常 */ public static function downloadBill($inputObj, $timeOut = 6) { $url = "https://api.mch.weixin.qq.com/pay/downloadbill"; //檢測必填參數 if(!$inputObj->IsBill_dateSet()) { throw new WxPayException("對帳單接口中,缺乏必填參數bill_date!"); } $inputObj->SetAppid(WxPayConfig::APPID);//公衆帳號ID $inputObj->SetMch_id(WxPayConfig::MCHID);//商戶號 $inputObj->SetNonce_str(self::getNonceStr());//隨機字符串 $inputObj->SetSign();//簽名 $xml = $inputObj->ToXml(); $response = self::postXmlCurl($xml, $url, false, $timeOut); if(substr($response, 0 , 5) == "<xml>"){ return ""; } return $response; } /** * 提交被掃支付API * 收銀員使用掃碼設備讀取微信用戶刷卡受權碼之後,二維碼或條碼信息傳送至商戶收銀臺, * 由商戶收銀臺或者商戶後臺調用該接口發起支付。 * WxPayWxPayMicroPay中body、out_trade_no、total_fee、auth_code參數必填 * appid、mchid、spbill_create_ip、nonce_str不須要填入 * @param WxPayWxPayMicroPay $inputObj * @param int $timeOut */ public static function micropay($inputObj, $timeOut = 10) { $url = "https://api.mch.weixin.qq.com/pay/micropay"; //檢測必填參數 if(!$inputObj->IsBodySet()) { throw new WxPayException("提交被掃支付API接口中,缺乏必填參數body!"); } else if(!$inputObj->IsOut_trade_noSet()) { throw new WxPayException("提交被掃支付API接口中,缺乏必填參數out_trade_no!"); } else if(!$inputObj->IsTotal_feeSet()) { throw new WxPayException("提交被掃支付API接口中,缺乏必填參數total_fee!"); } else if(!$inputObj->IsAuth_codeSet()) { throw new WxPayException("提交被掃支付API接口中,缺乏必填參數auth_code!"); } $inputObj->SetSpbill_create_ip($_SERVER['REMOTE_ADDR']);//終端ip $inputObj->SetAppid(WxPayConfig::APPID);//公衆帳號ID $inputObj->SetMch_id(WxPayConfig::MCHID);//商戶號 $inputObj->SetNonce_str(self::getNonceStr());//隨機字符串 $inputObj->SetSign();//簽名 $xml = $inputObj->ToXml(); $startTimeStamp = self::getMillisecond();//請求開始時間 $response = self::postXmlCurl($xml, $url, false, $timeOut); $result = WxPayResults::Init($response); self::reportCostTime($url, $startTimeStamp, $result);//上報請求花費時間 return $result; } /** * * 撤銷訂單API接口,WxPayReverse中參數out_trade_no和transaction_id必須填寫一個 * appid、mchid、spbill_create_ip、nonce_str不須要填入 * @param WxPayReverse $inputObj * @param int $timeOut * @throws WxPayException */ public static function reverse($inputObj, $timeOut = 6) { $url = "https://api.mch.weixin.qq.com/secapi/pay/reverse"; //檢測必填參數 if(!$inputObj->IsOut_trade_noSet() && !$inputObj->IsTransaction_idSet()) { throw new WxPayException("撤銷訂單API接口中,參數out_trade_no和transaction_id必須填寫一個!"); } $inputObj->SetAppid(WxPayConfig::APPID);//公衆帳號ID $inputObj->SetMch_id(WxPayConfig::MCHID);//商戶號 $inputObj->SetNonce_str(self::getNonceStr());//隨機字符串 $inputObj->SetSign();//簽名 $xml = $inputObj->ToXml(); $startTimeStamp = self::getMillisecond();//請求開始時間 $response = self::postXmlCurl($xml, $url, true, $timeOut); $result = WxPayResults::Init($response); self::reportCostTime($url, $startTimeStamp, $result);//上報請求花費時間 return $result; } /** * * 測速上報,該方法內部封裝在report中,使用時請注意異常流程 * WxPayReport中interface_url、return_code、result_code、user_ip、execute_time_必填 * appid、mchid、spbill_create_ip、nonce_str不須要填入 * @param WxPayReport $inputObj * @param int $timeOut * @throws WxPayException * @return 成功時返回,其餘拋異常 */ public static function report($inputObj, $timeOut = 1) { $url = "https://api.mch.weixin.qq.com/payitil/report"; //檢測必填參數 if(!$inputObj->IsInterface_urlSet()) { throw new WxPayException("接口URL,缺乏必填參數interface_url!"); } if(!$inputObj->IsReturn_codeSet()) { throw new WxPayException("返回狀態碼,缺乏必填參數return_code!"); } if(!$inputObj->IsResult_codeSet()) { throw new WxPayException("業務結果,缺乏必填參數result_code!"); } if(!$inputObj->IsUser_ipSet()) { throw new WxPayException("訪問接口IP,缺乏必填參數user_ip!"); } if(!$inputObj->IsExecute_time_Set()) { throw new WxPayException("接口耗時,缺乏必填參數execute_time_!"); } $inputObj->SetAppid(WxPayConfig::APPID);//公衆帳號ID $inputObj->SetMch_id(WxPayConfig::MCHID);//商戶號 $inputObj->SetUser_ip($_SERVER['REMOTE_ADDR']);//終端ip $inputObj->SetTime(date("YmdHis"));//商戶上報時間 $inputObj->SetNonce_str(self::getNonceStr());//隨機字符串 $inputObj->SetSign();//簽名 $xml = $inputObj->ToXml(); $startTimeStamp = self::getMillisecond();//請求開始時間 $response = self::postXmlCurl($xml, $url, false, $timeOut); return $response; } /** * * 生成二維碼規則,模式一輩子成支付二維碼 * appid、mchid、spbill_create_ip、nonce_str不須要填入 * @param WxPayBizPayUrl $inputObj * @param int $timeOut * @throws WxPayException * @return 成功時返回,其餘拋異常 */ public static function bizpayurl($inputObj, $timeOut = 6) { if(!$inputObj->IsProduct_idSet()){ throw new WxPayException("生成二維碼,缺乏必填參數product_id!"); } $inputObj->SetAppid(WxPayConfig::APPID);//公衆帳號ID $inputObj->SetMch_id(WxPayConfig::MCHID);//商戶號 $inputObj->SetTime_stamp(time());//時間戳 $inputObj->SetNonce_str(self::getNonceStr());//隨機字符串 $inputObj->SetSign();//簽名 return $inputObj->GetValues(); } /** * * 轉換短連接 * 該接口主要用於掃碼原生支付模式一中的二維碼連接轉成短連接(weixin://wxpay/s/XXXXXX), * 減少二維碼數據量,提高掃描速度和精確度。 * appid、mchid、spbill_create_ip、nonce_str不須要填入 * @param WxPayShortUrl $inputObj * @param int $timeOut * @throws WxPayException * @return 成功時返回,其餘拋異常 */ public static function shorturl($inputObj, $timeOut = 6) { $url = "https://api.mch.weixin.qq.com/tools/shorturl"; //檢測必填參數 if(!$inputObj->IsLong_urlSet()) { throw new WxPayException("須要轉換的URL,簽名用原串,傳輸需URL encode!"); } $inputObj->SetAppid(WxPayConfig::APPID);//公衆帳號ID $inputObj->SetMch_id(WxPayConfig::MCHID);//商戶號 $inputObj->SetNonce_str(self::getNonceStr());//隨機字符串 $inputObj->SetSign();//簽名 $xml = $inputObj->ToXml(); $startTimeStamp = self::getMillisecond();//請求開始時間 $response = self::postXmlCurl($xml, $url, false, $timeOut); $result = WxPayResults::Init($response); self::reportCostTime($url, $startTimeStamp, $result);//上報請求花費時間 return $result; } /** * * 支付結果通用通知 * @param function $callback * 直接回調函數使用方法: notify(you_function); * 回調類成員函數方法:notify(array($this, you_function)); * $callback 原型爲:function function_name($data){} */ public static function notify($callback, &$msg) { //獲取通知的數據 $xml = $GLOBALS['HTTP_RAW_POST_DATA']; //若是返回成功則驗證簽名 try { $result = WxPayResults::Init($xml); } catch (WxPayException $e){ $msg = $e->errorMessage(); return false; } return call_user_func($callback, $result); } /** * * 產生隨機字符串,不長於32位 * @param int $length * @return 產生的隨機字符串 */ public static function getNonceStr($length = 32) { $chars = "abcdefghijklmnopqrstuvwxyz0123456789"; $str =""; for ( $i = 0; $i < $length; $i++ ) { $str .= substr($chars, mt_rand(0, strlen($chars)-1), 1); } return $str; } /** * 直接輸出xml * @param string $xml */ public static function replyNotify($xml) { echo $xml; } /** * * 上報數據, 上報的時候將屏蔽全部異常流程 * @param string $usrl * @param int $startTimeStamp * @param array $data */ private static function reportCostTime($url, $startTimeStamp, $data) { //若是不須要上報數據 if(WxPayConfig::REPORT_LEVENL == 0){ return; } //若是僅失敗上報 if(WxPayConfig::REPORT_LEVENL == 1 && array_key_exists("return_code", $data) && $data["return_code"] == "SUCCESS" && array_key_exists("result_code", $data) && $data["result_code"] == "SUCCESS") { return; } //上報邏輯 $endTimeStamp = self::getMillisecond(); $objInput = new WxPayReport(); $objInput->SetInterface_url($url); $objInput->SetExecute_time_($endTimeStamp - $startTimeStamp); //返回狀態碼 if(array_key_exists("return_code", $data)){ $objInput->SetReturn_code($data["return_code"]); } //返回信息 if(array_key_exists("return_msg", $data)){ $objInput->SetReturn_msg($data["return_msg"]); } //業務結果 if(array_key_exists("result_code", $data)){ $objInput->SetResult_code($data["result_code"]); } //錯誤代碼 if(array_key_exists("err_code", $data)){ $objInput->SetErr_code($data["err_code"]); } //錯誤代碼描述 if(array_key_exists("err_code_des", $data)){ $objInput->SetErr_code_des($data["err_code_des"]); } //商戶訂單號 if(array_key_exists("out_trade_no", $data)){ $objInput->SetOut_trade_no($data["out_trade_no"]); } //設備號 if(array_key_exists("device_info", $data)){ $objInput->SetDevice_info($data["device_info"]); } try{ self::report($objInput); } catch (WxPayException $e){ //不作任何處理 } } /** * 以post方式提交xml到對應的接口url * * @param string $xml 須要post的xml數據 * @param string $url url * @param bool $useCert 是否須要證書,默認不須要 * @param int $second url執行超時時間,默認30s * @throws WxPayException */ private static function postXmlCurl($xml, $url, $useCert = false, $second = 30) { $ch = curl_init(); //設置超時 curl_setopt($ch, CURLOPT_TIMEOUT, $second); //若是有配置代理這裏就設置代理 if(WxPayConfig::CURL_PROXY_HOST != "0.0.0.0" && WxPayConfig::CURL_PROXY_PORT != 0){ curl_setopt($ch,CURLOPT_PROXY, WxPayConfig::CURL_PROXY_HOST); curl_setopt($ch,CURLOPT_PROXYPORT, WxPayConfig::CURL_PROXY_PORT); } curl_setopt($ch,CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//嚴格校驗 //設置header curl_setopt($ch, CURLOPT_HEADER, FALSE); //要求結果爲字符串且輸出到屏幕上 curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); if($useCert == true){ //設置證書 //使用證書:cert 與 key 分別屬於兩個.pem文件 curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM'); curl_setopt($ch,CURLOPT_SSLCERT, WxPayConfig::SSLCERT_PATH); curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM'); curl_setopt($ch,CURLOPT_SSLKEY, WxPayConfig::SSLKEY_PATH); } //post提交方式 curl_setopt($ch, CURLOPT_POST, TRUE); curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); //運行curl $data = curl_exec($ch); //返回結果 if($data){ curl_close($ch); return $data; } else { $error = curl_errno($ch); curl_close($ch); throw new WxPayException("curl出錯,錯誤碼:$error"); } } /** * 獲取毫秒級別的時間戳 */ private static function getMillisecond() { //獲取毫秒的時間戳 $time = explode ( " ", microtime () ); $time = $time[1] . ($time[0] * 1000); $time2 = explode( ".", $time ); $time = $time2[0]; return $time; } }