扫码支付模式二与模式一相比,流程更为简单,不依赖设置的回调支付URL。商户后台系统先调用微信支付的统一下单接口,微信后台系统返回链接参数code_url,商户后台系统将code_url值生成二维码图片,用户使用微信客户端扫码后发起支付。
模式二的接口类代码如下,主要功能是设置参数、生成链接以及获得URL。
1 /** 2 * 静态链接二维码 3 */ 4 class NativeLink_pub extends Common_util_pub 5 { 6 var $parameters; // 静态链接参数 7 var $url; // 静态链接 8 9 function __construct10 {11 }12 13 /**14 * 设置参数15 */16 function setParameter($parameter, $parameterValue)17 {18 $this->parameters[$this->trimString($parameter)] = $this->trimString($parameterValue);19 }20 21 /**22 * 生成Native支付链接二维码23 */24 function createLink25 {26 try27 {28 if($this->parameters["product_id"] == null)29 {30 throw new SDKRuntimeException("缺少Native支付二维码链接必填参数product_ id!"."<br>");31 }32 $this->parameters["appid"] = WxPayConf_pub::APPID;// 公众账号ID33 $this->parameters["mch_id"] = WxPayConf_pub::MCHID;// 商户号34 $time_stamp = time;35 $this->parameters["time_stamp"] = "$time_stamp";// 时间戳36 $this->parameters["nonce_str"] = $this->createNoncestr;// 随机字符串37 $this->parameters["sign"] = $this->getSign($this->parameters);// 签名38 $bizString = $this->formatBizQueryParaMap($this->parameters, false);39 $this->url = "weixin:// wxpay/bizpayurl?".$bizString;40 }catch (SDKRuntimeException $e)41 {42 die($e->errorMessage);43 }44 }45 46 /**47 * 返回链接48 */49 function getUrl50 {51 $this->createLink;52 return $this->url;53 }54 }
扫码支付模式二生成二维码的流程如下。
首先设置支付相关参数,其中需要自己指定的参数是商品的名称和价格,以及交易号。其他由系统自动获取或自动生成。其代码如下。
// 使用统一支付接口$unifiedOrder = new UnifiedOrder_pub;// 设置统一支付接口参数// 设置必填参数// appid已填,商户无须重复填写// mch_id已填,商户无须重复填写// noncestr已填,商户无须重复填写// spbill_create_ip已填,商户无须重复填写// sign已填,商户无须重复填写$unifiedOrder->setParameter("body","贡献一分钱"); // 商品描述// 自定义订单号,此处仅作举例$timeStamp = time;$out_trade_no = WxPayConf_pub::APPID."$timeStamp";$unifiedOrder->setParameter("out_trade_no","$out_trade_no"); // 商户订单号$unifiedOrder->setParameter("total_fee","1"); // 总金额$unifiedOrder->setParameter("notify_url",WxPayConf_pub::NOTIFY_URL); // 通知地址$unifiedOrder->setParameter("trade_type","NATIVE"); // 交易类型// 非必填参数,商户可根据实际情况选填// $unifiedOrder->setParameter("sub_mch_id","XXXX"); // 子商户号 // $unifiedOrder->setParameter("device_info","XXXX"); // 设备号 // $unifiedOrder->setParameter("attach","XXXX"); // 附加数据 // $unifiedOrder->setParameter("time_start","XXXX"); // 交易起始时间// $unifiedOrder->setParameter("time_expire","XXXX"); // 交易结束时间 // $unifiedOrder->setParameter("goods_tag","XXXX"); // 商品标记 // $unifiedOrder->setParameter("openid","XXXX"); // 用户标识// $unifiedOrder->setParameter("product_id","XXXX"); // 商品ID// 获取统一支付接口结果$unifiedOrderResult = $unifiedOrder->getResult;
参数生成之后,将生成如下XML数据。
<xml> <body><![CDATA[贡献一分钱]]></body> <out_trade_no><![CDATA[100001_1433009089]]></out_trade_no> <total_fee>1</total_fee> <notify_url><![CDATA[http:// www.doucube.com/weixin/demo/notify_url.php]]></notify_url> <trade_type><![CDATA[NATIVE]]></trade_type> <device_info>100001</device_info> <appid><![CDATA[wx1d065b0628e21103]]></appid> <mch_id>1237905502</mch_id> <spbill_create_ip><![CDATA[61.129.47.79]]></spbill_create_ip> <nonce_str><![CDATA[gwpdlnn0zlfih21gipjj5z53i7vea8e8]]></nonce_str> <sign><![CDATA[C5A1E210F9B4402D8254F731882F41AC]]></sign></xml>
将该XML数据向统一下单接口提交,返回的XML数据如下。
<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> <appid><![CDATA[wx1d065b0628e21103]]></appid> <mch_id><![CDATA[1237905502]]></mch_id> <device_info><![CDATA[100001]]></device_info> <nonce_str><![CDATA[6u8ovTtFupTagsiY]]></nonce_str> <sign><![CDATA[E84D8BC2331766DD685591F908367FF1]]></sign> <result_code><![CDATA[SUCCESS]]></result_code> <prepay_id><![CDATA[wx20150531020450bb586eb2f70717331240]]></prepay_id> <trade_type><![CDATA[NATIVE]]></trade_type> <code_url><![CDATA[weixin:// wxpay/bizpayurl?pr=dNp7omD]]></code_url> </xml>
其中包含code_url参数,code_url就是最终要生成的二维码的链接。当用户扫描二维码时,就能直接拉取到商户信息并完成支付。