|
|
@@ -4,7 +4,7 @@ require_once "WxPay.Config.php";
|
|
|
require_once "WxPay.Data.php";
|
|
|
|
|
|
/**
|
|
|
- *
|
|
|
+ *
|
|
|
* 接口访问类,包含所有微信支付API列表的封装,类中方法为static方法,
|
|
|
* 每个接口有默认超时时间(除提交被扫支付为10s,上报超时时间为1s外,其他均为6s)
|
|
|
* @author widyhu
|
|
|
@@ -13,7 +13,7 @@ require_once "WxPay.Data.php";
|
|
|
class WxPayApi
|
|
|
{
|
|
|
/**
|
|
|
- *
|
|
|
+ *
|
|
|
* 统一下单,WxPayUnifiedOrder中out_trade_no、body、total_fee、trade_type必填
|
|
|
* appid、mchid、spbill_create_ip、nonce_str不需要填入
|
|
|
* @param WxPayUnifiedOrder $inputObj
|
|
|
@@ -21,7 +21,7 @@ class WxPayApi
|
|
|
* @throws WxPayException
|
|
|
* @return 成功时返回,其他抛异常
|
|
|
*/
|
|
|
- public static function unifiedOrder($inputObj, $timeOut = 6, $merchantExtend=null)
|
|
|
+ public static function unifiedOrder($inputObj, $timeOut = 6, $sjExtend=null)
|
|
|
{
|
|
|
$url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
|
|
|
//检测必填参数
|
|
|
@@ -34,7 +34,7 @@ class WxPayApi
|
|
|
}else if(!$inputObj->IsTrade_typeSet()) {
|
|
|
throw new WxPayException("缺少统一支付接口必填参数trade_type!");
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
//关联参数
|
|
|
//if($inputObj->GetTrade_type() == "JSAPI" && !$inputObj->IsOpenidSet()){
|
|
|
if($inputObj->GetTrade_type() == "JSAPI" && (!$inputObj->IsOpenidSet() && !$inputObj->IsSub_openid())){
|
|
|
@@ -43,24 +43,24 @@ class WxPayApi
|
|
|
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
|
|
|
}
|
|
|
|
|
|
- if(isset($merchantExtend) == false){
|
|
|
- echo 'sjId:'.$merchantExtend.'取不到商家的支付信息';
|
|
|
+ if(isset($sjExtend) == false){
|
|
|
+ echo 'sjId:'.$sjExtend.'取不到商家的支付信息';
|
|
|
Yii::$app->end();
|
|
|
}
|
|
|
- $WxPayConfig = new WxPayConfig($merchantExtend);
|
|
|
+ $WxPayConfig = new WxPayConfig($sjExtend);
|
|
|
if(empty($WxPayConfig)){
|
|
|
echo '还是取不到商家的支付信息';
|
|
|
- Yii::$app->end();
|
|
|
+ Yii::$app->end();
|
|
|
}
|
|
|
|
|
|
//服务商代为发起微信支付
|
|
|
- if(isset($merchantExtend['wxPayApply']) && $merchantExtend['wxPayApply'] == 1){
|
|
|
+ if(isset($sjExtend['wxPayApply']) && $sjExtend['wxPayApply'] == 1){
|
|
|
$inputObj->SetAppid('wx66dd83ff8744f7a8');//花卉宝 公众账号ID
|
|
|
$inputObj->SetMch_id('1447921102');//花卉宝 服务商 商户号 -- 1447921102
|
|
|
$signKey = 'v3e29zx1i2xvc16m0x2v1bmca32svdvg';//花卉宝 服务商的key
|
|
|
@@ -89,7 +89,7 @@ class WxPayApi
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- *
|
|
|
+ *
|
|
|
* 查询订单,WxPayOrderQuery中out_trade_no、transaction_id至少填一个
|
|
|
* appid、mchid、spbill_create_ip、nonce_str不需要填入
|
|
|
* @param WxPayOrderQuery $inputObj
|
|
|
@@ -107,20 +107,20 @@ class WxPayApi
|
|
|
$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
|
|
|
@@ -138,20 +138,20 @@ class WxPayApi
|
|
|
$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不需要填入
|
|
|
@@ -160,7 +160,7 @@ class WxPayApi
|
|
|
* @throws WxPayException
|
|
|
* @return 成功时返回,其他抛异常
|
|
|
*/
|
|
|
- public static function refund($inputObj, $timeOut = 6,$appId,$mchid)
|
|
|
+ public static function refund($inputObj, $timeOut = 6)
|
|
|
{
|
|
|
$url = "https://api.mch.weixin.qq.com/secapi/pay/refund";
|
|
|
//检测必填参数
|
|
|
@@ -175,23 +175,22 @@ class WxPayApi
|
|
|
}else if(!$inputObj->IsOp_user_idSet()){
|
|
|
throw new WxPayException("退款申请接口中,缺少必填参数op_user_id!");
|
|
|
}
|
|
|
-
|
|
|
- $inputObj->SetAppid($appId);//公众账号ID
|
|
|
- $inputObj->SetMch_id($mchid);//商户号
|
|
|
+ $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个工作日后重新查询退款状态。
|
|
|
@@ -215,18 +214,18 @@ class WxPayApi
|
|
|
$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不需要填入
|
|
|
@@ -245,17 +244,17 @@ class WxPayApi
|
|
|
$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
|
|
|
* 收银员使用扫码设备读取微信用户刷卡授权码以后,二维码或条码信息传送至商户收银台,
|
|
|
@@ -265,7 +264,7 @@ class WxPayApi
|
|
|
* @param WxPayWxPayMicroPay $inputObj
|
|
|
* @param int $timeOut
|
|
|
*/
|
|
|
- public static function micropay($inputObj, $timeOut = 10, $merchantExtend=null)
|
|
|
+ public static function micropay($inputObj, $timeOut = 10,$sjExtend)
|
|
|
{
|
|
|
$url = "https://api.mch.weixin.qq.com/pay/micropay";
|
|
|
//检测必填参数
|
|
|
@@ -278,40 +277,25 @@ class WxPayApi
|
|
|
} else if(!$inputObj->IsAuth_codeSet()) {
|
|
|
throw new WxPayException("提交被扫支付API接口中,缺少必填参数auth_code!");
|
|
|
}
|
|
|
-
|
|
|
- if(isset($merchantExtend) == false){
|
|
|
- echo 'sjId:'.$merchantExtend.'取不到商家的支付信息';
|
|
|
- Yii::$app->end();
|
|
|
- }
|
|
|
- $WxPayConfig = new WxPayConfig($merchantExtend);
|
|
|
- if(empty($WxPayConfig)){
|
|
|
- echo '还是取不到商家的支付信息';
|
|
|
- Yii::$app->end();
|
|
|
- }
|
|
|
+
|
|
|
$inputObj->SetSpbill_create_ip($_SERVER['REMOTE_ADDR']);//终端ip
|
|
|
- //$inputObj->SetAppid(WxPayConfig::APPID);//公众账号ID
|
|
|
- //$inputObj->SetMch_id(WxPayConfig::MCHID);//商户号
|
|
|
- $inputObj->SetAppid($WxPayConfig->APPID);//公众账号ID
|
|
|
- $inputObj->SetMch_id($WxPayConfig->MCHID);//商户号
|
|
|
+ $inputObj->SetAppid($sjExtend['wxAppId']);//公众账号ID
|
|
|
+ $inputObj->SetMch_id($sjExtend['wxPayMerchantId']);//商户号
|
|
|
$inputObj->SetNonce_str(self::getNonceStr());//随机字符串
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- $signKey = $WxPayConfig->KEY;
|
|
|
-
|
|
|
- $inputObj->SetSign($signKey);//签名
|
|
|
+
|
|
|
+ $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
|
|
|
@@ -325,24 +309,24 @@ class WxPayApi
|
|
|
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不需要填入
|
|
|
@@ -369,19 +353,19 @@ class WxPayApi
|
|
|
$inputObj->SetAppid(WxPayConfig::APPID);//公众账号ID
|
|
|
$inputObj->SetMch_id(WxPayConfig::MCHID);//商户号
|
|
|
$inputObj->SetUser_ip($_SERVER['REMOTE_ADDR']);//终端ip
|
|
|
- $inputObj->SetTime(date("YmdHis"));//商户上报时间
|
|
|
+ $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
|
|
|
@@ -394,19 +378,19 @@ class WxPayApi
|
|
|
if(!$inputObj->IsProduct_idSet()){
|
|
|
throw new WxPayException("生成二维码,缺少必填参数product_id!");
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
$inputObj->SetAppid(WxPayConfig::APPID);//公众账号ID
|
|
|
$inputObj->SetMch_id(WxPayConfig::MCHID);//商户号
|
|
|
- $inputObj->SetTime_stamp(time());//时间戳
|
|
|
+ $inputObj->SetTime_stamp(time());//时间戳
|
|
|
$inputObj->SetNonce_str(self::getNonceStr());//随机字符串
|
|
|
-
|
|
|
+
|
|
|
$inputObj->SetSign();//签名
|
|
|
-
|
|
|
+
|
|
|
return $inputObj->GetValues();
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
- *
|
|
|
+ *
|
|
|
* 转换短链接
|
|
|
* 该接口主要用于扫码原生支付模式一中的二维码链接转成短链接(weixin://wxpay/s/XXXXXX),
|
|
|
* 减小二维码数据量,提升扫描速度和精确度。
|
|
|
@@ -426,20 +410,20 @@ class WxPayApi
|
|
|
$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);
|
|
|
@@ -457,26 +441,26 @@ class WxPayApi
|
|
|
$msg = $e->errorMessage();
|
|
|
return false;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
return call_user_func($callback, $result);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
- *
|
|
|
+ *
|
|
|
* 产生随机字符串,不长于32位
|
|
|
* @param int $length
|
|
|
* @return 产生的随机字符串
|
|
|
*/
|
|
|
- public static function getNonceStr($length = 32)
|
|
|
+ public static function getNonceStr($length = 32)
|
|
|
{
|
|
|
- $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
|
|
|
+ $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
|
|
|
$str ="";
|
|
|
- for ( $i = 0; $i < $length; $i++ ) {
|
|
|
- $str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);
|
|
|
- }
|
|
|
+ for ( $i = 0; $i < $length; $i++ ) {
|
|
|
+ $str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);
|
|
|
+ }
|
|
|
return $str;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 直接输出xml
|
|
|
* @param string $xml
|
|
|
@@ -485,9 +469,9 @@ class WxPayApi
|
|
|
{
|
|
|
echo $xml;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
- *
|
|
|
+ *
|
|
|
* 上报数据, 上报的时候将屏蔽所有异常流程
|
|
|
* @param string $usrl
|
|
|
* @param int $startTimeStamp
|
|
|
@@ -498,7 +482,7 @@ class WxPayApi
|
|
|
//如果不需要上报数据
|
|
|
if(WxPayConfig::REPORT_LEVENL == 0){
|
|
|
return;
|
|
|
- }
|
|
|
+ }
|
|
|
//如果仅失败上报
|
|
|
if(WxPayConfig::REPORT_LEVENL == 1 &&
|
|
|
array_key_exists("return_code", $data) &&
|
|
|
@@ -508,7 +492,7 @@ class WxPayApi
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
//上报逻辑
|
|
|
$endTimeStamp = self::getMillisecond();
|
|
|
$objInput = new WxPayReport();
|
|
|
@@ -542,7 +526,7 @@ class WxPayApi
|
|
|
if(array_key_exists("device_info", $data)){
|
|
|
$objInput->SetDevice_info($data["device_info"]);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
try{
|
|
|
self::report($objInput);
|
|
|
} catch (WxPayException $e){
|
|
|
@@ -552,7 +536,7 @@ class WxPayApi
|
|
|
|
|
|
/**
|
|
|
* 以post方式提交xml到对应的接口url
|
|
|
- *
|
|
|
+ *
|
|
|
* @param string $xml 需要post的xml数据
|
|
|
* @param string $url url
|
|
|
* @param bool $useCert 是否需要证书,默认不需要
|
|
|
@@ -560,13 +544,13 @@ class WxPayApi
|
|
|
* @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"
|
|
|
+ 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);
|
|
|
@@ -578,7 +562,7 @@ class WxPayApi
|
|
|
curl_setopt($ch, CURLOPT_HEADER, FALSE);
|
|
|
//要求结果为字符串且输出到屏幕上
|
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
|
|
|
-
|
|
|
+
|
|
|
if($useCert == true){
|
|
|
//设置证书
|
|
|
//使用证书:cert 与 key 分别属于两个.pem文件
|
|
|
@@ -596,13 +580,13 @@ class WxPayApi
|
|
|
if($data){
|
|
|
curl_close($ch);
|
|
|
return $data;
|
|
|
- } else {
|
|
|
+ } else {
|
|
|
$error = curl_errno($ch);
|
|
|
curl_close($ch);
|
|
|
throw new WxPayException("curl出错,错误码:$error");
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 获取毫秒级别的时间戳
|
|
|
*/
|