今天和大家分享一下关于微信扫码支付的主要流程。
1、从官网下载下来sdk后,按照说明进行商户信息的配置。
2、官网demo中,打开example文件夹中的native.php,可以看到一下两行。我们需要把这两行传入的数据记录到自己的数据表中。
$input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis"));//设置订单号
$input->SetProduct_id("123456789"); //这里是存于我们数据库的唯一订单标识,建议传订单号或者订单id
3、用户使用微信支付成功后,微信会回调数据给我们。回调数据中,有几个重要返回参数
"cash_fee":"1",
"is_subscribe":"Y", //是否支付
"out_trade_no":"139762060220161101101840", //订单号:使用这个返回值与之前我们记录到数据库中的值进行比对
"result_code":"SUCCESS",
"return_code":"SUCCESS",
"total_fee":"1",//支付总金额
"trade_state":"SUCCESS",
4、判断返回的数据是否支付成功,进而变更我们的订单的支付状态
实例:
1、请求微信获取支付码并输出
//请求微信获取支付码并输出
$.post('/zhifu/weixin/example/native.php',{'order_id':order_id},function(data2){
if(data2.return_code=='SUCCESS'){
$('#wx_pay_img').attr({'src':data2.zhifu_url});
$('#wx_pay_img').show();
}else{
alert("失败:"+data2.return_msg);
}
},'json')
2、在请求微信支付时,写一些业务逻辑
ini_set('date.timezone','Asia/Shanghai');
//error_reporting(E_ERROR);
require_once "../lib/WxPay.Api.php";
require_once "WxPay.NativePay.php";
require_once 'log.php';
$servername = "localhost";
$username = "*****";
$password = "*****";
if (!$link = mysql_connect($servername, $username, $password)) {
echo 'Could not connect to mysql';
exit;
}
if (!mysql_select_db('vip_house0769', $link)) {
echo 'Could not select database';
exit;
}
$order_id = $_REQUEST['order_id'];
$sql = "SELECT * FROM v9_chongzhi_order where id={$order_id} ";//echo $sql;
$result = mysql_query($sql, $link);
$order_info = mysql_fetch_assoc($result);
$notify = new NativePay();
$input = new WxPayUnifiedOrder();
$input->SetBody("充值");
$input->SetAttach("chongzhi");
$input->SetOut_trade_no($order_info['sn']);//设置订单号
$input->SetTotal_fee($order_info['chongzhi_money']);
$input->SetTime_start(date("YmdHis"));
$input->SetTime_expire(date("YmdHis", time() + 600));
$input->SetGoods_tag("chongzhi");
$input->SetNotify_url("http://www.域名.com/zhifu/weixin/example/notify.php");//支付成功后的回调地址
$input->SetTrade_type("NATIVE");
$input->SetProduct_id($order_info['id']);
$result = $notify->GetPayUrl($input);
if($result['return_code']=='SUCCESS'){
$url2 = $result["code_url"];
$result['zhifu_url'] = "http://www.域名.com/zhifu/weixin/example/qrcode.php?data=".urlencode($url2);
}
echo json_encode($result);
?>
3、支付成功后,回调文件中,写业务逻辑
ini_set('date.timezone','Asia/Shanghai');
error_reporting(E_ERROR);
require_once "../lib/WxPay.Api.php";
require_once '../lib/WxPay.Notify.php';
require_once 'log.php';
//初始化日志
$logHandler= new CLogFileHandler("../logs/".date('Y-m-d').'.log');
$log = Log::Init($logHandler, 15);
class PayNotifyCallBack extends WxPayNotify
{
//查询订单
public function Queryorder($transaction_id)
{
$input = new WxPayOrderQuery();
$input->SetTransaction_id($transaction_id);
$result = WxPayApi::orderQuery($input);
Log::DEBUG("query:" . json_encode($result));
if(array_key_exists("return_code", $result)
&& array_key_exists("result_code", $result)
&& $result["return_code"] == "SUCCESS"
&& $result["result_code"] == "SUCCESS")
{
//在这里写业务逻辑
$servername = "localhost";
$username = "*****";
$password = "******";
if (!$link = mysql_connect($servername, $username, $password)) {
echo 'Could not connect to mysql';
exit;
}
if (!mysql_select_db('vip_house0769', $link)) {
echo 'Could not select database';
exit;
}
$order_sn = $result['out_trade_no'];
$update_order_sql = "update v9_chongzhi_order set pay_time={$result['time_end']},pay_amount={$result['total_fee']},is_pay=1 where sn='{$order_sn}' ";//echo $sql;
$update_order_result = mysql_query($update_order_sql, $link);
$order_sql = "SELECT * FROM v9_chongzhi_order where sn='{$order_sn}' ";//echo $sql;
$order_result = mysql_query($order_sql, $link);
$order_info = mysql_fetch_assoc($order_result);
$chongzhi_money = round($result['total_fee']/100,2);
$update_amount_sql = "update v9_member set amount=amount+{$chongzhi_money} where userid={$order_info['user_id']} ";//echo $sql;
$update_amount_result = mysql_query($update_amount_sql, $link);
return true;
}
return false;
}
//重写回调处理函数
public function NotifyProcess($data, &$msg)
{
Log::DEBUG("call back:" . json_encode($data));
$notfiyOutput = array();
if(!array_key_exists("transaction_id", $data)){
$msg = "输入参数不正确";
return false;
}
//查询订单,判断订单真实性
if(!$this->Queryorder($data["transaction_id"])){
$msg = "订单查询失败";
return false;
}
return true;
}
}
Log::DEBUG("begin notify");
$notify = new PayNotifyCallBack();
$notify->Handle(false);
领取专属 10元无门槛券
私享最新 技术干货