ソースを参照

app 微信扫码支付

shish 4 年 前
コミット
22079edc6b

+ 45 - 27
app-ghs/controllers/OrderController.php

@@ -143,30 +143,48 @@ class OrderController extends BaseController
         ini_set('date.timezone', 'Asia/Shanghai');
         header("Content-type: text/html; charset=utf-8");
         $get = Yii::$app->request->get();
-
-        $wx = Yii::getAlias("@vendor/weixin");
-        require_once($wx . '/lib/WxPay.Api.php');
-        require_once($wx . '/example/WxPay.MicroPay.php');
-        $body = '鲜花';
-        $fee = '1'; //金额
-        $orderSn = ''; //订单号
+        $id = isset($get['id']) ? $get['id'] : 0;
+        $order = OrderClass::getById($id, true);
+        if (isset($order->status) == false || $order->status != 1) {
+            util::fail('不是待付款订单');
+        }
+        $cgId = $order->purchaseId ?? 0;
+        $cg = PurchaseClass::getById($cgId, true);
+        $orderSn = $cg->orderSn ?? '';
+        if (empty($orderSn)) {
+            util::fail('没有找到采购单');
+        }
+        $deadline = $cg->deadline;
+        $current = date("Y-m-d H:i:s");
+        if ((strtotime($deadline) + 20) < strtotime($current)) {
+            util::fail('订单已经失效');
+        }
+        $totalFee = $cg->actPrice ?? 0;
+        $name = '购买商品';
         //付款码
         $authCode = (string)$get['auth_code'] ?? '';
-        $input = new \WxPayMicroPay();
-        $input->SetAuth_code($authCode);
-        $input->SetBody($body);
-        $input->SetTotal_fee($fee);
-        $input->SetOut_trade_no($orderSn);
-        $merchantExtend = $this->sjExtend->attributes;
-        $microPay = new \MicroPay();
-        try{
-            $res= $microPay->pay($input,$merchantExtend);
-            if($res){
-                util::success('支付成功');
+        //获取微信商户号等信息
+        $sjExtend = WxOpenClass::getGhsWxInfo();
+
+        try {
+
+            $wx = Yii::getAlias("@vendor/wxPayApi_v3.0.10");
+            require_once($wx . '/lib/WxPay.Api.php');
+            require_once($wx . '/example/WxPay.MicroPay.php');
+
+            $input = new \WxPayMicroPay();
+            $input->SetAuth_code($authCode);
+            $input->SetBody($name);
+            $input->SetTotal_fee($totalFee * 100);
+            $input->SetOut_trade_no($orderSn);
+
+            $microPay = new \MicroPay();
+            $res = $microPay->pay($input, $sjExtend);
+            if(isset($res["return_code"]) && $res["return_code"] == "SUCCESS"){
+
             }
-            util::fail('支付失败');
-        }catch (\Exception $e){
-            util::fail('支付异常');
+        } catch (\Exception $e) {
+            util::fail('支付失败,请查询订单支付结果');
         }
     }
 
@@ -495,20 +513,20 @@ class OrderController extends BaseController
         $input->SetTrade_type("JSAPI");
 
         //花卉宝代为申请的微信支付
-        //$merchantExtend = $this->sjExtend->attributes;
-        $merchantExtend = WxOpenClass::getGhsWxInfo();
-        if (isset($merchantExtend['wxPayApply']) && $merchantExtend['wxPayApply'] == 1) {
+        //$sjExtend = $this->sjExtend->attributes;
+        $sjExtend = WxOpenClass::getGhsWxInfo();
+        if (isset($sjExtend['wxPayApply']) && $sjExtend['wxPayApply'] == 1) {
             $input->SetSub_openid($openId);
         } else {
             $input->SetOpenid($openId);
         }
 
         //强制使用小程序的miniAppId
-        $merchantExtend['wxAppId'] = $merchantExtend['miniAppId'];
+        $sjExtend['wxAppId'] = $sjExtend['miniAppId'];
 
-        $wxOrder = \WxPayApi::unifiedOrder($input, 6, $merchantExtend);
+        $wxOrder = \WxPayApi::unifiedOrder($input, 6, $sjExtend);
         $tools = new \JsApiPay();
-        $jsApiParameters = $tools->GetJsApiParameters($wxOrder, $merchantExtend);
+        $jsApiParameters = $tools->GetJsApiParameters($wxOrder, $sjExtend);
         $newParams = json_decode($jsApiParameters, true);
         //微信不能修改价格
         $current = date("Y-m-d H:i:s");

+ 22 - 23
vendor/weixin/example/WxPay.MicroPay.php

@@ -2,30 +2,30 @@
 $weixin		= Yii::getAlias("@vendor/weixin");
 require_once($weixin."/lib/WxPay.Api.php");
 /**
- *
+ * 
  * 刷卡支付实现类
  * 该类实现了一个刷卡支付的流程,流程如下:
  * 1、提交刷卡支付
  * 2、根据返回结果决定是否需要查询订单,如果查询之后订单还未变则需要返回查询(一般反复查10次)
  * 3、如果反复查询10订单依然不变,则发起撤销订单
  * 4、撤销订单需要循环撤销,一直撤销成功为止(注意循环次数,建议10次)
- *
+ * 
  * 该类是微信支付提供的样例程序,商户可根据自己的需求修改,或者使用lib中的api自行开发,为了防止
  * 查询时hold住后台php进程,商户查询和撤销逻辑可在前端调用
- *
+ * 
  * @author widy
  *
  */
 class MicroPay
 {
 	/**
-	 *
+	 * 
 	 * 提交刷卡支付,并且确认结果,接口比较慢
 	 * @param WxPayMicroPay $microPayInput
 	 * @throws WxpayException
 	 * @return 返回查询接口的结果
 	 */
-	public function pay($microPayInput,$merchantExtend=null)
+	public function pay($microPayInput,$merchantExtend)
 	{
 		//①、提交被扫支付
 		$result = WxPayApi::micropay($microPayInput, 5,$merchantExtend);
@@ -35,17 +35,16 @@ class MicroPay
 			|| !array_key_exists("result_code", $result))
 		{
 			echo "接口调用失败,请确认是否输入是否有误!";
-			Yii::error("付款码支付失败",json_encode($result));
 			throw new WxPayException("接口调用失败!");
 		}
-
+		
 		//签名验证
 		$out_trade_no = $microPayInput->GetOut_trade_no();
-
+		
 		//②、接口调用成功,明确返回调用失败
 		if($result["return_code"] == "SUCCESS" &&
-		   $result["result_code"] == "FAIL" &&
-		   $result["err_code"] != "USERPAYING" &&
+		   $result["result_code"] == "FAIL" && 
+		   $result["err_code"] != "USERPAYING" && 
 		   $result["err_code"] != "SYSTEMERROR")
 		{
 			return false;
@@ -67,7 +66,7 @@ class MicroPay
 				return false;
 			}
 		}
-
+		
 		//④、次确认失败,则撤销订单
 		if(!$this->cancel($out_trade_no))
 		{
@@ -76,9 +75,9 @@ class MicroPay
 
 		return false;
 	}
-
+	
 	/**
-	 *
+	 * 
 	 * 查询订单情况
 	 * @param string $out_trade_no  商户订单号
 	 * @param int $succCode         查询订单结果
@@ -89,8 +88,8 @@ class MicroPay
 		$queryOrderInput = new WxPayOrderQuery();
 		$queryOrderInput->SetOut_trade_no($out_trade_no);
 		$result = WxPayApi::orderQuery($queryOrderInput);
-
-		if($result["return_code"] == "SUCCESS"
+		
+		if($result["return_code"] == "SUCCESS" 
 			&& $result["result_code"] == "SUCCESS")
 		{
 			//支付成功
@@ -104,7 +103,7 @@ class MicroPay
 				return false;
 			}
 		}
-
+		
 		//如果返回错误码为“此交易订单号不存在”则直接认定失败
 		if($result["err_code"] == "ORDERNOTEXIST")
 		{
@@ -115,9 +114,9 @@ class MicroPay
 		}
 		return false;
 	}
-
+	
 	/**
-	 *
+	 * 
 	 * 撤销订单,如果失败会重复调用10次
 	 * @param string $out_trade_no
 	 * @param 调用深度 $depth
@@ -127,18 +126,18 @@ class MicroPay
 		if($depth > 10){
 			return false;
 		}
-
+		
 		$clostOrder = new WxPayReverse();
 		$clostOrder->SetOut_trade_no($out_trade_no);
 		$result = WxPayApi::reverse($clostOrder);
-
+		
 		//接口调用失败
 		if($result["return_code"] != "SUCCESS"){
 			return false;
 		}
-
+		
 		//如果结果为success且不需要重新调用撤销,则表示撤销成功
-		if($result["result_code"] != "SUCCESS"
+		if($result["result_code"] != "SUCCESS" 
 			&& $result["recall"] == "N"){
 			return true;
 		} else if($result["recall"] == "Y") {
@@ -146,4 +145,4 @@ class MicroPay
 		}
 		return false;
 	}
-}
+}

+ 87 - 103
vendor/weixin/lib/WxPay.Api.php

@@ -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");
 		}
 	}
-
+	
 	/**
 	 * 获取毫秒级别的时间戳
 	 */

+ 13 - 46
vendor/wxPayApi_v3.0.10/example/WxPay.MicroPay.php

@@ -6,8 +6,10 @@
 * 请勿直接直接使用样例对外提供服务
 * 
 **/
-require_once "../lib/WxPay.Api.php";
-require_once "WxPay.Config.php";
+
+$wx = Yii::getAlias("@vendor/wxPayApi_v3.0.10");
+require_once($wx . '/lib/WxPay.Api.php');
+require_once($wx . '/example/WxPay.Config.php');
 /**
  * 
  * 刷卡支付实现类
@@ -32,55 +34,20 @@ class MicroPay
 	 * @throws WxpayException
 	 * @return 返回查询接口的结果
 	 */
-	public function pay($microPayInput)
+	public function pay($microPayInput,$sjExtend)
 	{
 		//①、提交被扫支付
 		$config = new WxPayConfig();
-		$result = WxPayApi::micropay($config, $microPayInput, 5);
-		//如果返回成功
-		if(!array_key_exists("return_code", $result)
-			|| !array_key_exists("result_code", $result))
-		{
-			echo "接口调用失败,请确认是否输入是否有误!";
-			throw new WxPayException("接口调用失败!");
-		}
-		
-		//取订单号
-		$out_trade_no = $microPayInput->GetOut_trade_no();
-		
-		//②、接口调用成功,明确返回调用失败
-		if($result["return_code"] == "SUCCESS" &&
-		   $result["result_code"] == "FAIL" && 
-		   $result["err_code"] != "USERPAYING" && 
-		   $result["err_code"] != "SYSTEMERROR")
-		{
-			return false;
-		}
 
-		//③、确认支付是否成功
-		$queryTimes = 10;
-		while($queryTimes > 0)
-		{
-			$succResult = 0;
-			$queryResult = $this->query($out_trade_no, $succResult);
-			//如果需要等待1s后继续
-			if($succResult == 2){
-				sleep(2);
-				continue;
-			} else if($succResult == 1){//查询成功
-				return $queryResult;
-			} else {//订单交易失败
-				break;
-			}
-		}
-		
-		//④、次确认失败,则撤销订单
-		if(!$this->cancel($out_trade_no))
-		{
-			throw new WxpayException("撤销单失败!");
-		}
+        $mid = $sjExtend['wxPayMerchantId'] ?? '';
+        $appId = $sjExtend['miniAppId'] ?? '';
+        $key = $sjExtend['wxPayKey'] ?? '';
+        $config->SetAppId($appId);
+        $config->SetMerchantId($mid);
+        $config->SetKey($key);
 
-		return false;
+		$result = WxPayApi::micropay($config, $microPayInput, 5);
+        return $result;
 	}
 	
 	/**