微信訂單支付流程主要分為以下幾個(gè)步驟:
- 商戶服務(wù)器向微信支付提交統(tǒng)一下單請(qǐng)求,獲取到預(yù)支付交易會(huì)話標(biāo)識(shí)prepay_id。
- 商戶服務(wù)器生成客戶端調(diào)起支付所需的參數(shù)(如簽名sign、時(shí)間戳timestamp等),并將prepay_id等信息返回給客戶端。
- 客戶端通過(guò)調(diào)用微信支付SDK發(fā)起支付請(qǐng)求,并傳入上一步中生成的參數(shù)。
- 微信支付處理支付請(qǐng)求,用戶輸入密碼完成支付操作。
- 微信支付將支付結(jié)果通知商戶服務(wù)器,商戶服務(wù)器對(duì)支付結(jié)果進(jìn)行處理。
下面是一個(gè)簡(jiǎn)化版的代碼示例,僅供參考:
統(tǒng)一下單API請(qǐng)求
$url = 'https://api.mch.weixin.qq.com/pay/unifiedorder'; //微信支付統(tǒng)一下單API接口
$params = [
'appid' => 'your_appid', //微信支付分配的公眾賬號(hào)ID(企業(yè)號(hào)corpid即為此appId)
'mch_id' => 'your_mchid', //微信支付分配的商戶號(hào)
'nonce_str' => uniqid(), //隨機(jī)字符串,不長(zhǎng)于32位
'body' => 'Your Product Name', //商品描述
'out_trade_no' => 'Your Order Number', //商戶系統(tǒng)內(nèi)部的訂單號(hào)
'total_fee' => 100, //訂單總金額,單位為分
'spbill_create_ip' => $_SERVER['REMOTE_ADDR'], //APP和網(wǎng)頁(yè)支付提交用戶端ip,Native支付填調(diào)用微信支付API的機(jī)器IP
'notify_url' => 'Your Notify Url', //接收微信支付異步通知回調(diào)地址
'trade_type' => 'JSAPI', //交易類型,取值如下:JSAPI,NATIVE,APP等
'openid' => 'Your User Openid' //用戶在商戶appid下的唯一標(biāo)識(shí)
];
$params['sign'] = generate_sign($params, 'your_pay_key'); //生成簽名
$result = post_request($url, array_to_xml($params)); //發(fā)送POST請(qǐng)求
$response = xml_to_array($result); //處理API返回結(jié)果
if ($response['return_code'] == 'SUCCESS' && $response['result_code'] == 'SUCCESS') {
$prepay_id = $response['prepay_id']; //獲取預(yù)支付交易會(huì)話標(biāo)識(shí)prepay_id
}
生成客戶端調(diào)起支付所需的參數(shù)
$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'); //生成簽名
客戶端發(fā)起支付請(qǐng)求
WeixinJSBridge.invoke('getBrandWCPayRequest', <?php echo json_encode($params); ?>, function(res){
if (res.err_msg == "get_brand_wcpay_request:ok") {
//支付成功
} else {
//支付失敗
}
});
處理支付結(jié)果
$data = file_get_contents('php://input'); //獲取POST請(qǐng)求數(shù)據(jù)
$response = xml_to_array($data); //處理微信支付回調(diào)數(shù)據(jù)
if ($response['return_code'] == 'SUCCESS' && $response['result_code'] == 'SUCCESS') {
//驗(yàn)證簽名,確保數(shù)據(jù)安全
if (verify_sign($response, 'your_pay_key')) {
$out_trade_no = $response['out_trade_no']; //商戶訂單號(hào)
$transaction_id = $response['transaction_id']; //微信支付訂單號(hào)
$total_fee = $response['total_fee']; //訂單總金額,單位為分
//更新訂單狀態(tài)等相關(guān)操作
}
}
以上代碼僅供參考,實(shí)際應(yīng)用中還需根據(jù)具體情況進(jìn)行修改和調(diào)整。