这篇文章主要介绍扫码支付场景二。
目前有两种模式,模式一比模式二稍微复杂点,至于模式一与模式二的具体内容,流程,微信开发文档都有详细介绍,这里就不多说废话,接下来赶紧上教程!
下载SDK类文件
并SDK文件/lib下的几个文件放置到/ThinkPHP/Library/Vendor/
修改WxPay.pub.config.php中的配置选项
-
//=======【基本信息设置】=====================================
-
//微信公众号身份的唯一标识。审核通过后,在微信发送的邮件中查看
-
const APPID = '公众号表示ID';
-
//受理商ID,身份标识
-
const MCHID = '商户ID';
-
//商户支付密钥Key。审核通过后,在微信发送的邮件中查看
-
const KEY = 'KEY密匙';
-
//JSAPI接口中获取openid,审核后在公众平台开启开发模式后可查看
-
const APPSECRET = 'SECRET密匙';
-
//=======【JSAPI路径设置】===================================
-
//获取access_token过程中的跳转uri,通过跳转将code传入jsapi支付页面
-
const JS_API_CALL_URL = 'http://www.laoji.org';
-
//=======【证书路径设置】=====================================
-
//证书路径,注意应该填写绝对路径
-
const SSLCERT_PATH = "__ROOT__\paypem\\apiclient_cert.pem";
-
const SSLKEY_PATH = "__ROOT__\paypem\\apiclient_key.pem";
-
//=======【异步通知url设置】===================================
-
//异步通知url,商户根据实际开发过程设定
-
const NOTIFY_URL = 'http://www.laoji.org/wxpay/notify';
-
//=======【curl超时设置】===================================
-
//本例程通过curl使用HTTP POST方法,此处可修改其超时时间,默认为30秒
-
const CURL_TIMEOUT = 30;
新建微信的Controller方法
/*
* 微信支付
*/
public function wxPay()
{
$order_num = retailOrderNum(3);//订单编号
$money = $account * 100;//金额是分
//引入类文件
vendor('WxPcpay.WxPayPubHelper');
vendor('phpqrcode.phpqrcode');//引入
//使用统一支付接口
$unifiedOrder = new \UnifiedOrder_pub();
//设置统一支付接口参数
//设置必填参数
$unifiedOrder->setParameter("body", '供应商充值');//商品描述
//自定义订单号,此处仅作举例
$timeStamp = time();
$unifiedOrder->setParameter("out_trade_no", $order_num);//商户订单号
$unifiedOrder->setParameter("total_fee", 1);//总金额
$unifiedOrder->setParameter("time_start", date("YmdHis"));//交易起始时间
$unifiedOrder->setParameter("time_expire", date("YmdHis", time() + 7200));//交易结束时间
$unifiedOrder->setParameter("notify_url", '');//通知地址
$unifiedOrder->setParameter("trade_type", "NATIVE");//交易类型
//获取统一支付接口结果
$unifiedOrderResult = $unifiedOrder->getResult();
// var_dump($unifiedOrder);
//商户根据实际情况设置相应的处理流程
if ($unifiedOrderResult["return_code"] == "FAIL") {
//商户自行增加处理流程
//echo "通信出错:" . $unifiedOrderResult['return_msg'] . "<br>";
$data = array(
'code' => 2,
'msg' => "通信出错:" . $unifiedOrderResult['return_msg']
);
} elseif ($unifiedOrderResult["result_code"] == "FAIL") {
//商户自行增加处理流程
// echo "错误代码:" . $unifiedOrderResult['err_code'] . "<br>";
// echo "错误代码描述:" . $unifiedOrderResult['err_code_des'] . "<br>";
$data = array(
'code' => 3,
'msg' => "错误代码:" . $unifiedOrderResult['err_code'] . "<br>错误代码描述:" . $unifiedOrderResult['err_code_des']
);
} elseif ($unifiedOrderResult["code_url"] != NULL) {
//从统一支付接口获取到code_url
$code_url = $unifiedOrderResult["code_url"];
if (substr($code_url, 0, 6) == "weixin") {
ob_start();
$QRcode = new \QRcode();
$QRcode::png($code_url);
$imageString = base64_encode(ob_get_contents());
ob_end_clean();
$data = array(
'code' => 1,
'msg' => 'success',
'url' => "data:image/png;base64," . $imageString,
'url2' => $code_url,
'order_id' => $order_num
);
} else {
header('HTTP/1.1 404 Not Found');
}
} else {
$data = array(
'code' => 4,
'msg' => 'error'
);
}
$this->ajaxReturn($data);
}
/*
*微信异步回调地址
*/
public function wxNotify()
{
vendor('WxPcpay.WxPayPubHelper');
//使用通用通知接口
$notify = new \Notify_pub();
//存储微信的回调
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
$notify->saveData($xml);
// var_dump($xml);
//验证签名,并回应微信。
//对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,
//微信会通过一定的策略(如30分钟共8次)定期重新发起通知,
//尽可能提高通知的成功率,但微信不保证通知最终能成功。
if ($notify->checkSign() == FALSE) {
$notify->setReturnParameter("return_code", "FAIL");//返回状态码
$notify->setReturnParameter("return_msg", "签名失败");//返回信息
} else {
$notify->setReturnParameter("return_code", "SUCCESS");//设置返回码
}
$returnXml = $notify->returnXml();
echo $returnXml;
//==商户根据实际情况设置相应的处理流程,此处仅作举例=======
//以log文件形式记录回调信息
// $log_ = new Log_();
// $log_name= __ROOT__."/Public/notify_url.log";//log文件路径
// $this->log_result($log_name,"【接收到的notify通知】:\n".$xml."\n");
if ($notify->checkSign() == TRUE) {
if ($notify->data["return_code"] == "FAIL") {
//此处应该更新一下订单状态,商户自行增删操作
//log_result($log_name,"【通信出错】:\n".$xml."\n");
$this->error("通信出错");
} elseif ($notify->data["result_code"] == "FAIL") {
//此处应该更新一下订单状态,商户自行增删操作
// log_result($log_name,"【业务出错】:\n".$xml."\n");
$this->error("业务出错");
} elseif ($notify->data['return_code'] == "SUCCESS" && $notify->data['result_code'] == "SUCCESS") {
//数据库的操作
$out_trade_no = $notify->data['out_trade_no'];
$transaction_id = $notify->data['transaction_id'];
$ini['order_num'] = $out_trade_no;
$res = M('account_order')->where($ini)->find();
if($res['status'] == 1){
$this->orderResult($out_trade_no,$transaction_id);
}
return true;
//$this->success("支付成功!");
} else {
$this->error("UNKNOW ERROR");
}
}
}
/*
* 是否充值
*/
public function orderQuery()
{
$out_trade_no = I('post.out_trade_no');
$ini['order_num'] = $out_trade_no;
$res = M('account_order')->where($ini)->field('order_id,status')->find();
if ($res['order_id']) {
if ($res['status'] == 2) {
$arr = array(
'code' => 1,
'msg' => 'success'
);
} else {
$arr = array(
'code' => 3,
'msg' => 'error2'
);
}
} else {
$arr = array(
'code' => 2,
'msg' => 'error1'
);
}
$this->ajaxReturn($arr);
}
二维码生成页面的html
<div class="layui-form-item">
<div class="layui-inline">
<button class="layui-btn" type="button" id="recharge">去充值</button>
</div>
</div>
<script>
$(function () {
$("#recharge").click(function () {
var invoice_type = $("input[name='invoice_type']:checked").val();//是否开票
var pay_type = $("input[name='pay_type']:checked").val();//支付方式
var amount = $("#amount").val();
if(pay_type == 1){
$.post("{:U('Pay/wxPay')}",{
invoice_type:invoice_type,
pay_type:pay_type,
amount:amount
},function (data) {
console.log(data);
if(data.code == 1){
$("#order_id").val(data.order_id);
layer.open({
type: 1,
title: false,
closeBtn: 0,
shadeClose: true,
skin: 'yourclass',
content: '<img alt="模式二扫码支付" src="'+data.url+'" style="width:200px;height:200px;"/>'
});
}
},'json')
}else{
location.href="/suptem/Pay/alipayOrder?invoice_type="+invoice_type+'&amount='+amount;
}
});
</script>
<script language="JavaScript">
function Check(){
var out_trade_no = $('#order_id').val();
if(out_trade_no){
$.post("{:U('Pay/orderQuery')}", { out_trade_no: out_trade_no},
function(data){
if(data.msg == "success"){
window.location = "{:U('balanceRecord')}";
}
},'json');
}
}
window.setInterval("Check()",3000);
</script>
微信客户端支付成功以后,该页面会自动跳转到支付成功页面