php 一个文件搞定 提交付款码支付 应用场景

应用场景

收银员使用扫码设备读取微信用户付款码以后,二维码或条码信息会传送至商户收银台,由商户收银台或者商户后台调用该接口发起支付。

提醒1:提交支付请求后微信会同步返回支付结果。当返回结果为“系统错误”时,商户系统等待5秒后调用【查询订单API】,查询支付实际交易结果;当返回结果为“USERPAYING”时,商户系统可设置间隔时间(建议10秒)重新查询支付结果,直到支付成功或超时(建议30秒);

提醒2:在调用查询接口返回后,如果交易状况不明晰,请调用【撤销订单API】,此时如果交易失败则关闭订单,该单不能再支付成功;如果交易成功,则将扣款退回到用户账户。当撤销无返回或错误时,请再次调用。注意:请勿调用扣款后立即调用【撤销订单API】,建议至少15s后再调用。撤销订单API需要双向证书。

官方文档地址:https://pay.weixin.qq.com/wiki/doc/api/micropay_sl.php?chapter=9_10&index=1

具体代码

建立文件pay.php

<?php
$key = "0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";						//微信商户API密钥
$arr['auth_code'] = $_GET['auth_code'];
$arr['appid']  = "xxxxxxxxxxxxxxxxxx";								//应用APPID
$arr['mch_id'] = "1311111111";												//微信支付商户号
$arr['sub_mch_id'] = '1561111111';										//子商户号
$arr['out_trade_no'] = date('YmdHis').rand(1000,9999);//平台内部订单号
$arr['body'] = "扫码支付";														//内容
$arr['total_fee'] = 1; 																//金额
$arr['nonce_str'] = md5(rand(1000, 999999));					//随机字符串
$arr['spbill_create_ip'] = $_SERVER['REMOTE_ADDR'];   //获得用户设备IP 
ksort($arr);
$sign_tmp = $xml_tmp = '';
foreach($arr as $k => $v){
	$sign_tmp .= "$k=$v&";
	$xml_tmp .= "<$k>$v</$k>";
}
$sign = strtoupper(MD5($sign_tmp . "key=$key")); 				//MD5后转换成大写
$xml = "<xml>$xml_tmp<sign>$sign</sign></xml>";
$url = "https://api.mch.weixin.qq.com/pay/micropay";		//微信传参地址

$ch = curl_init();
curl_setopt($ch, CURLOPT_TIMEOUT, 30);									//设置超时
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);								//设置header
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 				//要求结果为字符串且输出到屏幕上
curl_setopt($ch, CURLOPT_POST, TRUE);										//POST提交方式
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
$dataxml = curl_exec($ch);															//运行curl
if(!$dataxml){
    $error = curl_errno($ch);
    echo "curl出错,错误码:$error"."<br>";
}
curl_close($ch);
//将微信返回的XML 转换成数组
$rs = (array)simplexml_load_string($dataxml, 'SimpleXMLElement', LIBXML_NOCDATA); 
echo 'over';
print_r($rs);

拼接后的XML举例如下:

<xml>
   <appid>wx2421b1c4370ec43b</appid>
   <attach>订单额外描述</attach>
   <auth_code>120269300684844649</auth_code>
   <body>付款码支付测试</body>
   <device_info>1000</device_info>
   <goods_tag></goods_tag>
   <mch_id>10000100</mch_id>
<sub_mch_id>10000101</sub_mch_id>
   <nonce_str>8aaee146b1dee7cec9100add9b96cbe2</nonce_str>
   <out_trade_no>1415757673</out_trade_no>
   <spbill_create_ip>14.17.22.52</spbill_create_ip>
   <time_expire></time_expire>
   <total_fee>1</total_fee>
   <sign>C29DB7DB1FD4136B84AE35604756362C</sign>
</xml>

注:参数值用XML转义即可,CDATA标签用于说明数据不被XML解析器解析。

使用方法

pay.php?auth_code=135610584558

将下图中的二维码数字输入auth_code值中即可。

评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注