# 申请流程

# 下载证书

img

# 获取Api密钥

img

# 设置支付授权目录

img

# 网页授权域名设置

需要登录微信公众平台进行以下设置

img

# 公众号支付

以下是基本的请求参数,如果有特殊需求请查看 微信支付官方文档 查看其他参数说明。

$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);
}