121 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			PHP
		
	
	
| <?php
 | ||
| 
 | ||
| namespace app\service;
 | ||
| 
 | ||
| 
 | ||
| use think\facade\Config;
 | ||
| 
 | ||
| class WechatMiniPay
 | ||
| {
 | ||
|     protected $WechatMiniPayConfig = [];//微信设置
 | ||
| 
 | ||
|     // 初始化
 | ||
|     public function __construct()
 | ||
|     {
 | ||
|         Config::load('extra/wechat', 'wechat');
 | ||
|         $this->WechatMiniPayConfig = config('wechat');
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * 微信小程序支付
 | ||
|      * @static
 | ||
|      * @access public
 | ||
|      * @param $order_number    订单号
 | ||
|      * @param $open_id         用户openid
 | ||
|      * @param $total_fee        支付金额
 | ||
|      * @param $body           支付抬头
 | ||
|      * @param $attach           附加数据
 | ||
|      */
 | ||
|     public function dopay(string $order_number = "",
 | ||
|                           string $open_id = "",
 | ||
|                           float $total_fee = 0,
 | ||
|                           string $body = "充值",
 | ||
|                           string $attach = "充值" ,
 | ||
|                           string $notify_url = ""
 | ||
|     )
 | ||
|     {
 | ||
|         if (!$order_number || !$open_id || !$total_fee || !$body || !$attach) {
 | ||
|             return ["state" => "fail"];
 | ||
|         }
 | ||
| //      开始组建支付数据数组
 | ||
|         $data['param'] = [];
 | ||
|         $data['param']['appid'] = $this->WechatMiniPayConfig["appId"];
 | ||
|         $data['param']['mch_id'] = $this->WechatMiniPayConfig["mchId"];
 | ||
|         $data['param']['nonce_str'] = randomStr(0, 16);
 | ||
|         $data['param']['body'] = $body;
 | ||
|         $data['param']['out_trade_no'] = $order_number;//商户下的唯一订单号
 | ||
| //        $data['param']['total_fee'] = $total_fee * 100;    // 单位:分
 | ||
|         $data['param']['total_fee'] = 1;    // 单位:分
 | ||
|         $data['param']['spbill_create_ip'] = request()->ip();
 | ||
|         $data['param']['notify_url'] = $notify_url;
 | ||
|         $data['param']['trade_type'] = 'JSAPI';//支付方式  NATIVE表示二维码支付
 | ||
| //        $data['param']['product_id'] = $order["commodity_id"];//商品id  非必填
 | ||
|         $data['param']['attach'] = $attach;//附加数据  附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用。
 | ||
|         $data['param']['openid'] = $open_id;//用户openid
 | ||
|         $data['param']['sign'] = wechatSign($data['param'], $this->WechatMiniPayConfig["mchKey"]); //key为商户平台设置的密钥key
 | ||
| 
 | ||
|         $pay_data = array_to_xml($data['param']);
 | ||
| 
 | ||
|         //请求支付 JSAPI 不会直接吊起支付请求  返回prepay_id是微信生成的预支付会话标识,用于后续接口调用中使用
 | ||
|         $result_data2 = Tool::httpRequest("https://api.mch.weixin.qq.com/pay/unifiedorder", "post", $pay_data);
 | ||
| 
 | ||
|         $result_data = xmlToArray($result_data2);
 | ||
| 
 | ||
| 
 | ||
|         //如果返回数据验证成功
 | ||
|         if (isset($result_data["prepay_id"]) && isset($result_data["result_code"]) && $result_data["return_code"] == "SUCCESS" && $result_data["result_code"] == "SUCCESS") {
 | ||
|             $js_data = [];
 | ||
|             $js_data["appId"] = $this->WechatMiniPayConfig["appId"];
 | ||
|             $js_data["timeStamp"] = (string)time();
 | ||
|             $js_data["nonceStr"] = $data['param']['nonce_str'];
 | ||
|             $js_data["package"] = "prepay_id=" . $result_data["prepay_id"];
 | ||
|             $js_data["signType"] = "MD5";
 | ||
|             $js_data["paySign"] = wechatSign($js_data, $this->WechatMiniPayConfig["mchKey"]);;
 | ||
|             return ["state" => "ok", "data" => $js_data];
 | ||
|         } else {
 | ||
|             return (["state" => "fail",
 | ||
|                 "message" => "fail:" .
 | ||
|                     (isset($result_data["err_code_des"])
 | ||
|                         ?
 | ||
|                         $result_data["err_code_des"]
 | ||
|                         :
 | ||
|                         '错误'
 | ||
|                     )]);
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * 微信支付查询
 | ||
|      * @param $order_number    订单号
 | ||
|      */
 | ||
|     public function wechatQueryOrder($order_number = "")
 | ||
|     {
 | ||
|         if (empty($order_number)) {
 | ||
|             return ["state" => "fail", "message" => "fail"];
 | ||
|         }
 | ||
|         $data['param'] = [];
 | ||
|         $data['param']['appid'] = $this->WechatMiniPayConfig["appId"];
 | ||
|         $data['param']['mch_id'] = $this->WechatMiniPayConfig["mchId"];
 | ||
|         $data['param']['nonce_str'] = randomStr(0, 16);
 | ||
|         $data['param']['out_trade_no'] = $order_number;//商户下的唯一订单号
 | ||
|         $data['param']['sign'] = wechatSign($data['param'], $this->WechatMiniPayConfig["mchKey"]); //key为商户平台设置的密钥key
 | ||
|         $xml = array_to_xml($data['param']);
 | ||
|         $wechat_data = Tool::httpRequest("https://api.mch.weixin.qq.com/pay/orderquery", "post", $xml);
 | ||
| 
 | ||
|         $wechat_data = xmlToArray($wechat_data);
 | ||
| 
 | ||
|         if ($wechat_data["return_code"] == "SUCCESS") {// 通信标识
 | ||
| 
 | ||
|             if ($wechat_data["result_code"] == "SUCCESS") {//业务标识   订单不存在或者微信服务器错误
 | ||
| 
 | ||
|                 if ($wechat_data["trade_state"] == "SUCCESS") {//如果支付成功
 | ||
| 
 | ||
|                     return array("state" => "ok", "queryData" => $wechat_data);
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
|         return array("state" => "fail");
 | ||
|     }
 | ||
| 
 | ||
| 
 | ||
| } |