thinkphp5微信支付

1、先讲一下申请流程,要有公共服务号,使用服务号的商户号、Appid、Key。

2、开始开发咯

下载微信支付开发文档中的demo,其他文件我也没看懂啥意思,只用到了以下文件(注意,WxPay.Api.php重命名为以下格式,把点去掉,方便在控制器中import):

thinkphp5微信支付_第1张图片

3、请求微信接口获取二维码链接

public function wechat_pay(){
		
		if(empty($_GET)) $this->error('数据异常');
		$money = input('get.money/d') <= 0 || empty(input('get.money/d')) || input('?get.money/d') ? $this->error('充值金额异常') : input('get.money/d');
		$id = input('get.id/d') <= 0 ? $this->error('充值ID异常') : input('get.id/d');
		//导入微信支付类库
		import('WxPay.WxPayApi');
		$wechat = new \WxPayApi();//API类库
		$send_data = new \WxPayUnifiedOrder();
		$notify = new \NativePay();
		$send_data->SetBody("积分充值");
		$send_data->SetAttach("积分充值详情");
		$out_trade_no = \WxPayConfig::MCHID.date("YmdHis");
		$send_data->SetOut_trade_no($out_trade_no);
		$send_data->SetTotal_fee($money);
		$send_data->SetTime_start(date("YmdHis"));
		$send_data->SetTime_expire(date("YmdHis", time() + 600));
		$send_data->SetNotify_url("https://www.***.com/home/Wxnotify/notify");
		$send_data->SetTrade_type("NATIVE");
		$send_data->SetProduct_id($id);
		$result = $notify->GetPayUrl($send_data);
		//判断是否成功,本地增加充值记录
		if($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS' && $result['return_msg'] == 'OK'){
			$db_res = db('wx_recharge')
				->insert([
					'uid' => $this->user_id,
					'money' => $money,
					'out_trade_no' => $out_trade_no,
					'add_time' => time()
				]);
			if(!$db_res) $this->error('本地数据异常');
		}else{
			$this->error('充值异常');
		}
		$url = $result["code_url"];
		$this->assign('url',urlencode($url));
		return $this->fetch();
	}

4、生成二维码

public function qrcode(){
		import('WxPay.WxPayApi');
		$url = urldecode(input('get.url'));
		\QRcode::png($url);
	}

5、在html中显示出二维码

6、支付成功后异步处理数据

public function notify(){
		
		$xml = file_get_contents("php://input");
		import('WxPay.WxPayApi');
		$WxPayDataBase = new \WxPayDataBase();
		$res = $WxPayDataBase->FromXml($xml);//xml转为数组
		if($res['return_code'] == 'SUCCESS' && $res['result_code'] == 'SUCCESS'){
			//********************************************************************
			$out_trade_no = $res['out_trade_no'];
			//获取该订单本地信息
			$charge_info = db('wx_recharge')
				->field('uid,status')
				->where('out_trade_no',$out_trade_no)
				->find();
			if($charge_info['status'] == 0){//验证该订单是否未处理
				//增加用户积分
				$integral_res = IntegralAdd($charge_info['uid'],'微信充值增加积分',5,$res['total_fee']);
				if($integral_res){
					//修改订单状态为支付成功
					if(db('wx_recharge')->where('out_trade_no',$out_trade_no)->update(['status' => 1])){
						//回复通知
						/* echo '
								  
								  
							  ';
						exit(); */
					}else{
						$this->notify_log('订单号:'.$res['out_trade_no'].'订单状态更新异常');
					}
				}else{
					$this->notify_log('ID为:'.$charge_info['uid'].'积分增加异常');
				}
			}else{
				$this->notify_log('订单号:'.$res['out_trade_no'].'重复通知');
			}
		}else{
			$this->notify_log('没有正确返回'.$xml);
		}
	}
	
	public function notify_log($info){
		
		file_put_contents(ROOT_PATH."runtime/log.txt",$info.'-------时间:'.date('Y/m/d H/i/d',time()).PHP_EOL,FILE_APPEND);
	}

好了,大功告成了,注意,异步处理中我没写订单真实性的判断,自己请求下微信的查询订单接口就行了

你可能感兴趣的:(thinkphp5)