1、先讲一下申请流程,要有公共服务号,使用服务号的商户号、Appid、Key。
2、开始开发咯
下载微信支付开发文档中的demo,其他文件我也没看懂啥意思,只用到了以下文件(注意,WxPay.Api.php重命名为以下格式,把点去掉,方便在控制器中import):
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中显示出二维码
<img style="width:150px;height:150px;" src="__URL__/qrcode?url={$url}">
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 '<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
</xml>';
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);
}
好了,大功告成了,注意,异步处理中我没写订单真实性的判断,自己请求下微信的查询订单接口就行了