Appearance
申请流程
下载证书
获取Api密钥
设置支付授权目录
网页授权域名设置
需要登录微信公众平台进行以下设置
公众号支付
以下是基本的请求参数,如果有特殊需求请查看 微信支付官方文档 查看其他参数说明。
$data = [
//订单总金额,单位为分
'total_fee' => 1,
//商品简单描述
'body' => '会员充值',
//附加数据,在查询API和支付异步通知中原样返回,可作为自定义参数使用
'attach' => 'uid=1&city=北京',
//商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一。
'out_trade_no' => time(),
//异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。
'notify_url' => 'http://dev.hdcms.com/component/wechat/tests/app/notifyUrl.php',
];
$res = WeChat::instance('pay')->jsapi($data);
if ($res['errcode'] == 'SUCCESS') {
echo "支付成功,商城定单号:{$res['out_trade_no']},并为用户显示成功页面";
} else {
echo "支付错误: ".$res['errmsg'];
}
扫码支付
使用的微信提供的模式二支付方式流程更为简单,不需要在微信管理平台设置的回调支付URL。
$data = [
//订单总金额,单位为分
'total_fee' => 1,
//商品简单描述
'body' => '扫码支付',
//附加数据,在查询API和支付异步通知中原样返回,可作为自定义参数使用
'attach' => 'uid=1&city=扫码',
//商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一。
'out_trade_no' => time(),
//异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。
'notify_url' => 'http://dev.hdcms.com/component/wechat/tests/app/notifyUrl.php',
];
$res = WeChat::instance('pay')->payByCode($data);
if (isset($res['code_url']) && $res['result_code'] == 'SUCCESS') {
//创建二维码
$img = QrCode::make($res['code_url']);
die("<img src='{$img}'>");
} else {
echo "支付错误: ".$res['errmsg'];
}
扫码后跳转
下面我们来介绍一下当我扫码二维码支付成功后PC端的跳转方法。 PC端用setInterval定时请求后台,用websocket给微信发送notify时同时请求socket或者用ajax轮询,当支付状态改变后,将页面跳转即可。
异步通知
支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。
对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。 (通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)查看通知提供的字段
需要在发起支付时正确传递参数 notify_url 来指明通知的url地址
$data = WeChat::instance('pay')->getNotifyMessage();
if ($data['result_code'] == 'SUCCESS' && $data['return_code'] == 'SUCCESS') {
/**
* 并校验返回的订单金额是否与商户侧的订单金额一致
* 防止数据泄漏导致出现“假通知”,造成资金损失
*/
//商城的业务处理比如用会积分更改等
/**
* 商户处理后同步返回给微信参数
* 告诉微信支付已经确认,不用再发送异步通知
*/
$data = [
'return_code' => 'SUCCESS',
'return_msg' => 'OK',
];
die(\houdunwang\xml\Xml::toSimpleXml($data));
}
查询订单
使用以下任一参数都可以在微信中查询定单信息。微信官网手册
参数 | 说明 |
---|---|
微信订单号 | transaction_id |
商户订单号 | out_trade_no |
//测试查询定单
$data = [
'out_trade_no' => 1494906587,
];
$res = WeChat::instance('pay')->orderQuery($data);
if ($res['return_code'] == 'SUCCESS' && $res['result_code'] == 'SUCCESS') {
//定单查询成功
print_r($res);
}