工程作完了 來個總結php
1.提交訂單 1.1 提交參數(主要參數) 用戶id、商家id、服務id、服務單價、數量、總價 1.2 驗證提交過來的信息是否正確 驗證參數:單價與總價 1.3 向訂單表插入數據 狀態:未付款、未評價 1.4 返回訂單id數據庫
//以下2~10是微信支付、查詢、退款流程 2.支付(先說微信支付流程,支付寶的下面說) 2.1 提交參數(不涉及三方接口需求參數) 用戶id、訂單id、支付金額、商品描述(微信支付接口須要) 2.2 支付前檢查訂單信息(存在今年下單明年支付,服務價格發生變化的狀況) 驗證參數:單價與總價 2.3 微信支付所需參數 //https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1 應用ID、商品描述、商戶號、隨機字符串、微信回調地址、商戶訂單ID、終端IP、交易類型、交易金額、簽名 2.4 向微信發送支付請求 2.5 微信返回請求信息 2.5.1 請求成功(return_code=SUCCESS)(注意:請求成功不表明支付成功,具體看微信支付文檔) 接着判斷return_msg,若是爲非空,則說明請求失敗(其實這裏不用判斷也行), 2.5.1.1 向微信預支付記錄表插入一條記錄(即每次發起微信支付請求,不管成功與否,都要向微信預支付記錄表插入記錄,記錄包括:客戶端請求信息與微信服務端返回信息) 2.5.2 請求失敗 很明顯,直接向微信預支付記錄表插入一條記錄。 2.6 請求成功,驗證簽名信息 根據微信返回的參數 進行簽名驗證,驗證失敗,向微信預支付記錄表插入一條記錄。 2.7 請求成功,驗證簽名成功 2.7.1 解析微信返回的信息 2.7.2 判斷(result_code=SUCCESS),這是交易碼,它用於判斷支付成功/失敗 2.7.2.1 成功,說明交易成功了,設置返回給移動端的數據 2.7.2.2 失敗,說明請求成功了,支付失敗了 2.8 不管成功/失敗,向微信預支付記錄表插入一條記錄。api
3.移動端確認支付 //微信支付流程 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_3 移動端開發流程詳見 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5 3.1 移動端調用微信支付 2.7交易成功返回給移動端預支付id、擴展字段、簽名等字段,移動端註冊appId、調起微信支付接口、發起微信支付請求(微信支付流程中的8,9,10三個步驟);接着微信服務器受權驗證,經過後,返回給移動端輸入密碼的頁面,移動端輸入正確的密碼,確認支付(微信支付流程中的11,12,13),微信服務器驗證經過後,分爲兩步 3.1 同步通知:支付結果同步通知給移動端 3.2 異步通知:支付結果異步通知給商戶服務器--就是回調服務數組
4.微信回調服務器端,異步通知支付結果 //微信支付結果通知 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_7&index=3 4.1 取回調中的數據 // 代碼以下,回調數據是xml格式 while ((inputLine = request.getReader().readLine()) != null) { notityXml += inputLine; } request.getReader().close(); 4.2 將xml格式的數據轉換成map方式 4.3 判斷回調是否成功 return_code=SUCCESS表示回調成功 4.3.1 return_code=SUCCESS,再判斷return_msg=OK,若是失敗,則向微信支付記錄表插入一條記錄 4.3.2 return_code=FAIL,則直接向微信支付記錄表插入一條記錄 4.4 判斷支付是否成功 result_code=SUCCESS表示支付成功 4.4.1 支付成功,開始驗證回調返回參數 4.4.2 驗證失敗,向微信支付記錄表插入一條記錄 4.4.3 驗證成功,說明支付成功了,這時候須要作兩件事 4.4.3.1 向微信服務器發送"return_code", "SUCCESS"和"return_msg", "OK" 4.4.3.2 處理本身服務器的業務,須要的參數:訂單id、支付憑證id 0>因爲微信回調會有屢次,因此更新訂單表以前須要檢查下該訂單的狀態,若是已是"已付款",則不須要再次更新訂單表與向paycode表插入記錄 1>更新訂單表,訂單狀態:"已付款",付款方式:"微信支付",支付憑證單號:"xx", 2>更新訂單表成功後,向訂單支付碼錶插入記錄,有幾個服務,就須要插入幾條記錄 插入paycode表,關鍵字段 消費狀態:未消費;退款狀態:無退款;有效區分:有效;有效開始時間和有效截止時間服務器
5.微信向移動端同步通知支付結果 微信服務器回調移動端onResp函數,向移動端發送支付結果。注意:不能以客戶端收到的結果做爲用戶支付結果,應該以服務器端接收到的支付通知或者是移動端查詢支付結果爲準。微信
6.移動端查詢微信支付結果 //微信查詢訂單接口 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_2&index=4 6.1 查詢參數 應用ID、商戶號、訂單ID(移動端傳過來)、隨機字符串、簽名 6.2 查詢返回參數 同上面的步驟一致,判斷查詢是否成功 查詢成功後,驗證返回信息的有效性 驗證成功後,判斷支付結果 支付成功後,處理本身的業務 處理業務與微信服務器回調成功後處理的相同。app
7.移動端調 關閉訂單接口 //微信關閉訂單接口 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_3&index=5 注:如下狀況須要調用 關閉訂單接口 1>用戶訂單支付失敗須要從新生成訂單號從新發起支付,此時須要對原訂單號關閉,避免重複支付 2>用戶發起支付後,在規定的時間內未支付,系統再也不受理該次支付,須要關閉該訂單 同上述步驟同樣,只是 須要向 微信支付訂單關閉記錄表 插入數據異步
8.用戶退款申請 8.1 請求本地服務器申請退款 請求參數:訂單ID、退款數量、退款金額、退款緣由 退款狀況 1>所有使用,用戶與商家商量退款事宜,生成退款單 2>部分使用/所有未使用,容許退款未使用的部分,生成退款單與退款單明細表 8.2 本地服務器驗證退款信息 1>判斷該訂單支付時間,大於7天,不予退款 2>查詢該訂單已消費支付碼(unUsePaymentCodeList數組)與未消費支付碼(usePaymentCodeList數組) 3>判斷部分使用/所有未使用狀況 3-1>判斷 unUsePaymentCodeList.size() == refundNum 3-2>上述成立後,判斷refundMoney.equals(refundNum * paymentCodeList.get(0).getPrice()),即移動端傳過來的 退款金額==移動端傳過來的退款數量*該服務在數據庫的價格。 4>判斷所有使用的狀況 4-1>判斷usePaymentCodeList.size() == refundNum 4-2>上述成立後,判斷refundMoney.equals(refundNum * paymentCodeList.get(0).getPrice()) 8.3 開始本地業務處理 8.3.1 向退款單裏插入一條記錄 8.3.2 處理所有消費狀況的業務 更新支付碼錶狀態,主要字段:退款狀態、退款申請號 8.3.2 處理部分消費/所有未消費的業務 循環處理 for (int i = 0; i < unUsePaymentCodeList.size(); i++){ 1>向退款明細表裏插入記錄 2>更新該paymentCode狀態,主要字段:退款狀態、退款申請號(在payCode表) } 8.4 給移動端返回 退款單id函數
9.申請微信退款 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_4&index=6 這是由本地服務器端完成 移動端提交主要參數:用戶ID、訂單ID、訂單金額、商品描述、退款單號、退款金額。 退款參數驗證 1>訂單金額要與下單金額同樣 2>退款金額要小於下單金額 9.1 步驟同微信支付、查詢相似 1>設置微信退款所需參數 2>提交退款申請請求 3>接收微信返回信息 4>判斷退款請求是否成功,這時候都須要向 微信退款記錄表裏插入記錄 5>驗證微信發回來參數的有效性,失敗,向 微信退款記錄表裏插入記錄 6>驗證成功,向 微信退款記錄表裏插入記錄,同時處理本地業務 6-1>更新退款單表,主要字段:退款狀態(已退款)、微信退款單號 6-2>判斷是否存在退款單詳情,若是存在,則須要更新退款單詳情表,主要字段:退款狀態(已退款) 6-3>更新訂單明細表,主要字段,退款狀態微信支付
10.微信退款查詢 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_5&index=7 移動端提交參數:退款單id 10.1 步驟同微信退款步驟相似 10.2 查詢退款成功後,處理與 退款成功後 同樣的業務
//以下是支付寶支付、查詢、退款流程 11.支付(支付寶) 11.1 移動端提交給本地服務器的參數 用戶ID、訂單ID、訂單金額 11.2 依然是處理 提交參數的驗證 單價驗證/總價驗證 11.3 本地服務器組合支付寶須要的參數,包括簽名驗證等信息,回傳給移動端,同時須要向 支付寶發起支付記錄表插入一條記錄 返回給移動端數據:支付記錄ID、支付寶請求所需參數 11.4 移動端調起手機裏面的支付寶支付程序,將從本地服務器接收的數據傳給支付程序,並向支付寶服務器端發起支付請求 11.5 支付寶服務器端驗證移動端請求參數 1>同步向 移動端發出 支付結果 2>異步向 本地服務器發出 支付結果 11.6 本地服務器接收到支付寶回調後,處理本地業務 11.6.1 回調成功後,向支付寶支付記錄表插入一條記錄(不管支付是否成功,這裏都插入一條記錄) 11.6.2 回調成功,且支付成功後,處理本地服務器業務 //這裏的業務就和微信支付時同樣 1>更新訂單表狀態 主要字段:支付狀態(已付款)、支付方式(支付寶)、支付憑證 2>向paymentCode表插入記錄 11.6.3 移動端向服務器發送支付結果查詢 提交參數:訂單ID、支付寶同步回調返回給移動端的內容、支付寶支付記錄ID 1>移動端整合支付寶查詢接口所需的參數 2>發送支付查詢請求 3>查詢成功、支付成功、驗證成功,接着處理本地的業務 //回調有屢次,因此這裏更新訂單表信息以前先判斷下是否已經更新 3-1>更新訂單表信息 3-2>向訂單詳情表插入記錄(多個服務時,多條記錄) 11.7 用戶發起退款 提交參數:用戶ID、訂單ID、訂單金額、商品描述、退款單號、退款金額 11.7.1 服務器端整合支付寶退款所需數據 11.7.2 服務器端向支付寶服務器端發送退款申請 //支付寶即時到帳有密退款接口 https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.Df968Y&treeId=62&articleId=104744&docType=1 11.7.3 支付寶處理完成後,會同步通知商戶(當前頁面跳轉的方式)與異步通知商戶。商戶能夠從頁面跳轉同步通知獲取信息 或者 從服務器異步通知頁面中 獲取支付寶返回的信息。 11.8 總結下退款流程 1>用戶到已下單的商品頁面,點擊退款,即向商家cms發送一條退款請求。 2>接着用戶頁面會顯示"商品退款中,請等待"。 3>此時賣家的cms裏會有一條退款信息(退款申請人、退款商品信息、退款申請日期、退款緣由、退款金額等信息) 4>賣家覈實信息後,點擊"贊成退款"(選擇支付寶退款),即向支付寶服務器發送退款請求信息。 主要參數包括:商家在支付寶的註冊信息、退款金額等信息,即向支付寶轉帳退款金額。 5>支付寶服務器收到商家的轉帳信息,覈實後,一方面通知商家退款成功;同時支付寶向買家的支付寶帳戶中轉入商家退款金額。
表設計以下 1.用戶訂單表
2.支付碼錶
3.退款表
4.退款明細表