微信扫码支付分为两种模式,
模式一比较复杂,需要公众号配置回调地址。
模式二比较简单,只需要在代码中配置回调地址就可以了。
我这次使用的是模式二。
需要配置参数,
const APPID = 'xxx';const MCHID = 'xxx';const KEY = 'xxx';const APPSECRET = 'xxx';
配置公众号的appid,appsecret。以及微信支付的mchid与key。
生成二维码,这个页面需要自己去美化,不像支付宝那样自带效果。
require_once "./phpcms/plugin/weixinpay/lib/WxPay.Api.php";require_once "./phpcms/plugin/weixinpay/example/WxPay.NativePay.php";require_once './phpcms/plugin/weixinpay/example/log.php';$input = new WxPayUnifiedOrder();$input->SetBody('预订'.$product_info['name'].'订单');$input->SetAttach('预订'.$product_info['name'].'订单');$input->SetOut_trade_no($order_info['orderno']);$input->SetTotal_fee($order_info['payprice'] * 100);$input->SetTime_start(date("YmdHis"));$input->SetTime_expire(date("YmdHis", time() + 600));$input->SetGoods_tag("");$input->SetNotify_url("http://www.ayuanduanzu.com/wxpay/notify.php"); // 地址是外网能访问的,且不能包含参数$input->SetTrade_type("NATIVE");$input->SetProduct_id($product_info['id']);$notify = new NativePay();$result = $notify->GetPayUrl($input);$code_url = $result["code_url"];<img alt="扫码支付" src="http://paysdk.weixin.qq.com/example/qrcode.php?data={urlencode($code_url)}" style="width:150px;height:150px;"/>
这里的回调地址很有讲究,扫码支付成功后,微信会自动调用这个地址。这个地址不能包含任何参数,否则调用失败。啥都看不到!
微信调用的时候,会传递xml类型的参数。
include_once "../phpcms/base.php";// 处理回调数据error_reporting(E_ERROR);require_once "../phpcms/plugin/weixinpay/lib/WxPay.Api.php";require_once '../phpcms/plugin/weixinpay/lib/WxPay.Notify.php';require_once '../phpcms/plugin/weixinpay/example/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"){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();$ilog_db = pc_base::load_model('ilog_model');$order_db = pc_base::load_model('order_model');$postXml = $GLOBALS["HTTP_RAW_POST_DATA"];$postArr = xmlToArray($postXml);// 查询是否支付成功$r = $notify->Queryorder($postArr['transaction_id']);if ($r) {// 获取订单信息$order_info = $order_db->get_one(array('orderno'=>$postArr['out_trade_no']));if ($order_info['pay_status'] != '1') {$data['pay_status'] = '1';$data['pay_type'] = 'weixinpay';$data['pay_code'] = $postArr['transaction_id'];$data['paytime'] = time();$data['order_status']= 3; // 已支付$order_db->update($data,array('orderno'=>$postArr['out_trade_no']));}?>
新闻热点
疑难解答