项目环境:thinkphp商城
在上篇文章,已经调通sdk写引入进来到thinkPHP中
扫码模式支付二相对来说比较简单,没有多少坑,难点就是支付成功的回调页面,写一个ajax请求每隔3秒执行一次查询
1,支付页面控制器做一个判断,是否是wenxin支付方式进来
if( $paytype == "weixin"){ //若付款扫描支付方式是微信进入 不是进入else
if(!empty($_POST['orderid'])){
$order_no=safe_replace(I('post.orderid'));
$info=M("order")->where("tag='$order_no'")->find();
if(!empty($info)){
$money=$info['total_money'];
} else{
$info=M("order")->where("orderid='$order_no'")->find();
$money=$info['total_money'];
}
$body= C('SITENAME')."订单支付";//商品描述
$title=C('SITENAME')."订单支付";//设置商品名称
}
$money = $money * 100; //微信默认是分为单位,剩100
//使用统一支付接口
$input = new \WxPayUnifiedOrder();
$notify = new \NativePay();
$input->SetBody("$body");
$input->SetAttach("$title");
$input->SetOut_trade_no(\WxPayConfig::MCHID.date("YmdHis"));
$input->SetTotal_fee($money);
$input->SetTime_start(date("YmdHis"));
$input->SetTime_expire(date("YmdHis", time() + 600));
$input->SetGoods_tag("test");
$input->SetNotify_url("http://luochao.tunnel.qydev.com/yershopv/index.php/Pay/notify.html");
$input->SetTrade_type("NATIVE");
$input->SetProduct_id($_POST['orderid']);
$result = $notify->GetPayUrl($input);
$out_trade_no = $input->GetOut_trade_no();
$url2 = $result["code_url"];
//获取统一支付接口结果
$unifiedOrderResult = $result;
//商户根据实际情况设置相应的处理流程
if ($unifiedOrderResult["return_code"] == "FAIL")
{
//商户自行增加处理流程
echo "通信出错:".$unifiedOrderResult['return_msg']."<br>";
}
elseif($unifiedOrderResult["result_code"] == "FAIL")
{
//商户自行增加处理流程
echo "错误代码:".$unifiedOrderResult['err_code']."<br>";
echo "错误代码描述:".$unifiedOrderResult['err_code_des']."<br>";
}
elseif($unifiedOrderResult["code_url"] != NULL)
{
//从统一支付接口获取到code_url
$code_url = $unifiedOrderResult["code_url"];
//商户自行增加处理流程
//......
}
$this->assign('orderid',$_POST['orderid']);
$this->assign('out_trade_no',$out_trade_no);
$this->assign('code_url',$url2);
$this->assign('unifiedOrderResult',$unifiedOrderResult);
$this->display('native_pays');
}
2,视图页面native_pays(显示二维码,3秒调用ajax执行查询是否已经支付,支付完就跳转页面)
<script src="__JS__/jquery.min.js"></script> //
<div align="center" id="qrcode">
</div>
<div align="center">
<input type="hidden" value="{$out_trade_no}" name="out_trade_no">
<input type="hidden" value="{$orderid}" name="orderid">
<p>订单号:{$out_trade_no}</p>
<p>url2:{$code_url}</p>
</div>
<script src="__JS__/qrcode.js"></script> //生成二维码脚本必须
<script>
if(<?php echo $unifiedOrderResult["code_url"] != NULL; ?>)
{
var url = "<?php echo $code_url;?>";
//参数1表示图像大小,取值范围1-10;参数2表示质量,取值范围'L','M','Q','H'
var qr = qrcode(10, 'M');
qr.addData(url);
qr.make();
var wording=document.createElement('p');
wording.innerHTML = "扫我,扫我";
var code=document.createElement('DIV');
code.innerHTML = qr.createImgTag();
var element=document.getElementById("qrcode");
element.appendChild(wording);
element.appendChild(code);
}
</script>
<script>
$(function(){
setInterval(function(){check()} , 3000); //没隔三秒执行一次 ajax
function check(){
var out_trade_no = $("input[name=out_trade_no]").val();
var orderid = $("input[name=orderid]").val();
var param = {
'out_trade_no':out_trade_no,
'orderid':orderid,
};
$.ajax({
type: "post",
url: '{:U("Pay/orderquery")}', //请求函数
async: false,
data: {'out_trade_no':out_trade_no,'orderid':orderid},
success: function (data) {
if (data == "SUCCESS") {
alert("订单支付成功,即将跳转...");
window.location.href = '{:U("Home/Pay/over")}';
}
else {
result = false;
}
}
});
/***************/
}
})
</script>
3,ajax请求方法处理,
传微信的商户订单号:用在查询微信订单接口返回信息
商城生成的订单号,支付成功把此订单号改为已支付状态
/**
* AJAX方法查询订单号,返回信息处理
*/
public function orderquery($out_trade_no=null, $orderid=null){
$out_trade_no = $_POST['out_trade_no'];
$orderid = $_POST['orderid'];
/****调用微信接口,返回支付后的参数*****/
if(isset($out_trade_no) && $out_trade_no != ""){
$out_trade_no = $_REQUEST["out_trade_no"];
$input = new \WxPayOrderQuery();
$input->SetOut_trade_no($out_trade_no);
$result = \WxPayApi::orderQuery($input);
}
/*判断是否支付成功*/
if ( $result["trade_state"] == "SUCCESS" ){
/**订单支付成功操作*/
$money = $result["total_fee"]/100; //获取微信支付金额,给到success
/*修改订单状态为已支付*/
$dataa = array('status'=>'1','ispay'=>'2');//订单已经支付,状态为已提交
$info = M('order')->where(array('tag' => $orderid))->setField($dataa);
if(!empty($info)){
} else{
M('order')->where(array('orderid' => $orderid))->setField($dataa);
}
/*支付完后写入到支付表中*/
M("Pay")->add(array(
'out_trade_no' => $out_trade_no,
'money' => $money,
'status' => 0,
'create_time' => time(),
'update_time' => time()
));
}
$data = $result["trade_state"];
$this->ajaxReturn($data);
}