下载地址:链接: https://pan.baidu.com/s/1eRUkvtC 密码: eu98
原作者的:链接: https://pan.baidu.com/s/1dFyE4t7 密码: s9a7
下载后直接解压至extend目录下
然后去公共函数库common写一个函数:
//微信支付函数
function wxpay($body,$total_fee,$out_trade_no){
//传入支付参数
//$out_trade_no = date('Ymd').time().mt_rand();
$params = [
'body' => $body,
'out_trade_no' => $out_trade_no,
'total_fee' => $total_fee,
'product_id' => $out_trade_no,
'notify_url' => 'http://'.$_SERVER['HTTP_HOST'].'/index/user/notifyPay',
];
$result = \wxpay\NativePay::getPayImage($params,300,300);
return $result;
}
这个$result返回的是一个封装好的img标签包含处理好的二维码
在这里贴出上面使用的getPayIamge方法
checkParams($params);
if(empty($params['product_id'])) {
throw new \WxPayException('商品ID(product_id)商品ID必须');
}
// 2.组装参数
$input = $that->getPostData($params);
// 3.进行请求
$tools = new \WxPayNativePay();
$result = $tools->GetPayUrl($input);
// 4.进行结果检验
$that->checkResult($result);
// 5.返回支付二维码图片
$url = urlencode($result["code_url"]);
$payImage = "";
return $payImage;
}
// 组装请求参数
private function getPostData($params)
{
$input = new \WxPayUnifiedOrder();
$input->SetBody($params['body']);
$input->SetOut_trade_no($params['out_trade_no']);
$input->SetTotal_fee($params['total_fee']);
// $input->SetGoods_tag("test");
$input->SetNotify_url($params['notify_url']);
$input->SetTrade_type("NATIVE");
$input->SetProduct_id($params['product_id']);
return $input;
}
}
异步查询控制方法,是利用js'的ajax方法请求
//ajax实时请求微信支付结果
public function notifypay($out_trade_no)
{
$result = \wxpay\Query::exec($out_trade_no);
if($result['trade_state'] == 'SUCCESS'){
return 1;
}else{
return 0;
}
}
在这里依然贴出上面调用的Query方法
SetTransaction_id($query_no);
} else {
$input->SetOut_trade_no($query_no);
}
// 2.进行请求
$result = \WxPayApi::orderQuery($input);
return $result;
}
}
在这里贴出处理订单的判断及方法
//如果支付成功,跳转页面,开始处理订单状态
public function doorder($oid)
{
//通过订单号向微信查询改订单状态数据集
$data = \wxpay\Query::exec($oid);
if(!array_key_exists("transaction_id", $data)){
$this->success('不存在的订单号','commend/commendStore');
}
//获取该订单号数据
$order = OrderModel::get(['oid'=>$oid]);
if(!$order->oid) {
$this->success('不存在的订单号','commend/commendStore');
}
if($order->status == 2){
$this->success('订单已经被处理过','commend/commendStore');
}
//获取订单号中优惠卡的数据
$card = Card::get($order->card_id);
//获取平台财务数据
$m = Finance::get(1);
//设置分润,earn为平台提成,money为平台剩余商户余额
$earn = $card->promotion_price * ($m->commission / 100);
$money = $card->promotion_price - $earn;
//保持小数点后两位,累加到平台余额
$m->money = $m->money + round($money,2);
$m->earn = $m->earn + round($earn,2);
// 启动事务
Db::startTrans();
try{
//修改订单状态和保存平台财务数据
OrderModel::where('oid',$oid)->update(['status'=>2]);
$m->save();
// 提交事务
Db::commit();
} catch (\Exception $e) {
// 回滚事务
Db::rollback();
$this->success('订单处理失败,请联系运营方','commend/commendStore');
}
$this->success('付款成功','commend/commendStore');
}
在最后贴出扫描二维码页面的js
$(function(){
setInterval(function(){check()} , 10000); //每隔三秒执行一次 ajax
function check(){
var out_trade_no = $('#oid').html();
$.ajax({
type: "post",
url: '{:url("store/order/notifypay")}', //请求函数
async: false,
data: {'out_trade_no':out_trade_no},
dataType: "json",
success: function (data) {
if (data == 1) {
location.href="/store/order/doorder/oid/"+out_trade_no;
}else{
result = false;
}
}
});
}
})