微信订单支付流程主要分为以下几个步骤:
- 商户服务器向微信支付提交统一下单请求,获取到预支付交易会话标识prepay_id。
- 商户服务器生成客户端调起支付所需的参数(如签名sign、时间戳timestamp等),并将prepay_id等信息返回给客户端。
- 客户端通过调用微信支付SDK发起支付请求,并传入上一步中生成的参数。
- 微信支付处理支付请求,用户输入密码完成支付操作。
- 微信支付将支付结果通知商户服务器,商户服务器对支付结果进行处理。
下面是一个简化版的代码示例,仅供参考:
统一下单API请求
$url = 'https://api.mch.weixin.qq.com/pay/unifiedorder'; //微信支付统一下单API接口
$params = [
'appid' => 'your_appid', //微信支付分配的公众账号ID(企业号corpid即为此appId)
'mch_id' => 'your_mchid', //微信支付分配的商户号
'nonce_str' => uniqid(), //随机字符串,不长于32位
'body' => 'Your Product Name', //商品描述
'out_trade_no' => 'Your Order Number', //商户系统内部的订单号
'total_fee' => 100, //订单总金额,单位为分
'spbill_create_ip' => $_SERVER['REMOTE_ADDR'], //APP和网页支付提交用户端ip,Native支付填调用微信支付API的机器IP
'notify_url' => 'Your Notify Url', //接收微信支付异步通知回调地址
'trade_type' => 'JSAPI', //交易类型,取值如下:JSAPI,NATIVE,APP等
'openid' => 'Your User Openid' //用户在商户appid下的唯一标识
];
$params['sign'] = generate_sign($params, 'your_pay_key'); //生成签名
$result = post_request($url, array_to_xml($params)); //发送POST请求
$response = xml_to_array($result); //处理API返回结果
if ($response['return_code'] == 'SUCCESS' && $response['result_code'] == 'SUCCESS') {
$prepay_id = $response['prepay_id']; //获取预支付交易会话标识prepay_id
}
生成客户端调起支付所需的参数
$timestamp = time();
$noncestr = uniqid();
$params = [
'appId' => 'your_appid',
'timeStamp' => strval($timestamp),
'nonceStr' => $noncestr,
'package' => 'prepay_id=' . $prepay_id,
'signType' => 'MD5'
];
$params['paySign'] = generate_sign($params, 'your_pay_key'); //生成签名
客户端发起支付请求
WeixinJSBridge.invoke('getBrandWCPayRequest', <?php echo json_encode($params); ?>, function(res){
if (res.err_msg == "get_brand_wcpay_request:ok") {
//支付成功
} else {
//支付失败
}
});
处理支付结果
$data = file_get_contents('php://input'); //获取POST请求数据
$response = xml_to_array($data); //处理微信支付回调数据
if ($response['return_code'] == 'SUCCESS' && $response['result_code'] == 'SUCCESS') {
//验证签名,确保数据安全
if (verify_sign($response, 'your_pay_key')) {
$out_trade_no = $response['out_trade_no']; //商户订单号
$transaction_id = $response['transaction_id']; //微信支付订单号
$total_fee = $response['total_fee']; //订单总金额,单位为分
//更新订单状态等相关操作
}
}
以上代码仅供参考,实际应用中还需根据具体情况进行修改和调整。