微信支付api的服务器上,服务器微信支付接口笔记(与app端对接)
到這里,準備工作就算完成了。
支付流程步驟詳解:
步驟1:用戶在商戶APP中選擇商品,提交訂單,選擇微信支付。
這一步,app將相關訂單信息提交給商戶
步驟2:商戶后臺收到用戶支付單,調用微信支付統一下單接口。參見【統一下單API】。
商戶系統先調用該接口在微信支付服務后臺生成預支付交易單,返回正確的預支付交易回話標識后再在APP里面調起支付。
步驟3:統一下單接口返回正常的prepay_id,再按簽名規范重新生成簽名后,將數據傳輸給APP。參與簽名的字段名為appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式為Sign=WXPay
步驟4:商戶APP調起微信支付。api參見本章節【app端開發步驟說明】(與服務器接口無關)
步驟5:商戶后臺接收支付通知。api參見【支付結果通知API】
步驟6:商戶后臺查詢支付結果。,api參見【查詢訂單API】
遇到的問題:
1 商戶用于接收微信的支付通知,鏈接是通過【統一下單API】中提交的參數notify_url設置,如果鏈接無法訪問,商戶將無法接收到微信通知,不能帶參數,微信返回類型為post,xml格式
2 接收到支付通知首先要做簽名驗證,防止數據泄漏導致出現“假通知”,造成資金損失,就是收到的參數,除了sign字段之外的字段做簽名之后,與收到的sign比較。
3 處理重復問題,微信可能會多次返回信息,要處理重復訂單的問題,主要是解決【統一下單API】的訂單號
4 另外,5里面要對6進行驗證,驗證無誤,才可以在商戶端對訂單支付狀態進行修改,防止假通知,或誤操作。
上代碼:(步驟5,6的)<>
/**
* 通用通知接口demo
* ====================================================
* 支付完成后,微信會把相關支付和用戶信息發送到商戶設定的通知URL,
* 商戶接收回調信息后,根據需要設定相應的處理流程。
*
* 這里舉例使用log文件形式記錄回調信息。
*/
require_once dirname(__FILE__).'/log_.php';
// include_once('./log_.php');
require_once '/xxxxxx.php';
// include_once('../xxxxxx.php');
//使用通用通知接口
$notify = new Notify_pub();
//存儲微信的回調
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
$notify->saveData($xml);//將微信的請求xml轉換成關聯數組,以方便數據處理
if (empty($data))
return false;
//驗證簽名,并回應微信。
//對后臺通知交互時,如果微信收到商戶的應答不是成功或超時,微信認為通知失敗,
//微信會通過一定的策略(如30分鐘共8次)定期重新發起通知,
//盡可能提高通知的成功率,但微信不保證通知最終能成功。
if($notify->checkSign() == FALSE){
//設置兩個數組的字段值
$notify->setReturnParameter('return_code','FAIL');//返回狀態碼
$notify->setReturnParameter('return_msg','簽名失敗');//返回信息
}else{
$notify->setReturnParameter('return_code','SUCCESS');//設置返回碼
}
$returnXml = $notify->returnXml();
echo $returnXml;
//==商戶根據實際情況設置相應的處理流程,此處僅作舉例=======
//以log文件形式記錄回調信息
$log_ = new Log_();
$log_name=dirname(__FILE__)'/notify_url.log';//log文件路徑
$log_->log_result($log_name,'【接收到的notify通知】:\n'.$xml.'\n');
if($notify->checkSign() == TRUE)
{
if ($notify->data['return_code'] == 'FAIL'||empty($notify->data['return_code'])) {
//此處應該更新一下訂單狀態,商戶自行增刪操作
$log_->log_result($log_name,'【通信出錯】:\n'.$xml.'\n');
}
elseif($notify->data['result_code'] == 'FAIL'||empty($notify->data['result_code'])){
//此處應該更新一下訂單狀態,商戶自行增刪操作
$log_->log_result($log_name,'【業務出錯】:\n'.$xml.'\n');
}
else{
$check = new OrderQuery_pub();
if(!$check->createXml()){
$msg = '訂單查詢失敗';
$log_->log_result($log_name,'訂單查詢失敗:\n'.time().'\n');
return false;
}
// if (empty($data['out_trade_no'])){
// // file_put_contents('/xxxxx/aaa.txt', '3');
// return false;
// }
ksort($data);
reset($data);
$payment = D('Payment')->getPayment('weixin');
/* 檢查支付的金額是否相符 */
//商戶邏輯
}
//簽名驗證
$sign = array();
foreach ($data as $key => $val) {
if ($key != 'sign') {
$sign[] = $key . '=' . $val;
}
}
$sign[] = 'key=' . $payment['appkey'];
//用&將sign元素拼接成字串
$signstr = strtoupper(md5(join('&', $sign)));
if ($signstr != $data['sign']){
$log_->log_result($log_name,'【簽名失敗】:\n''用于組件sign的數組為:='.$sign.'\n');
return false;
}
//商戶,對訂單操作
echo 'SUCCESS';
$log_->log_result($log_name,'【支付成功】:\n'.$xml.time().'\n');
die();
}
//商戶自行增加處理流程,
//例如:更新訂單狀態
//例如:數據庫操作
//例如:推送支付完成信息
}
?>
如果你覺得有用的話,頂一下吧 ! ^o^
總結
以上是生活随笔為你收集整理的微信支付api的服务器上,服务器微信支付接口笔记(与app端对接)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux命令行if判断使用(linux
- 下一篇: 笑傲江湖客户端服务器地址修改,《笑傲江湖