本文是【淺析微信支付】系列文章的第十二篇,主要講解在商戶存在的提現、商戶付款到微信用戶零錢或者銀行卡需求。
淺析微信支付系列已經更新十二篇了喲~,沒有看過的朋友們能夠看一下哦。php
淺析微信支付:如何使用沙箱環境測試github
若是你是作電商或者某些有福利返利的系統,基本上會遇到諸如 餘額提現
這類需求,主要就是平臺向用戶返利現金,積累到某一個門檻,能夠領取到本身的餘額帳號、銀行卡;或者是使用爲用戶發送現金紅包的方式。後端
接下來的兩篇文章,會爲你們描述在微信支付中,像用戶付款的以上三種方式。api
如下爲三種付款方式的必要條件:微信
企業付款提供由商戶直接付錢至用戶微信零錢的能力,支持平臺操做及接口調用兩種方式,資金到帳速度快,使用及查詢方便。主要用來解決合理的商戶對用戶付款需求,好比:保險理賠、彩票兌換等等。app
如何開通?測試
所需資料:開通企業付款到零錢功能無需提供額外的材料。
費用:試用期間無償使用。
企業付款爲企業提供付款至用戶零錢的能力,支持經過API接口付款,或經過微信支付商戶平臺(pay.weixin.qq.com)網頁操做付款。
如下爲官方的解釋:
https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_1
抓重點,首先須要知道的是,開通了運營帳戶
的商戶,付款時會從運營帳戶餘額中扣除,這個必定要注意,以避免金額不足時付款失敗(可使用主帳戶爲運營帳戶充值,參考[交易中心]-[充值/轉入])。
如下爲特別須要注意的地方,爲你們標記出來,設計系統時必定要參考一下,以避免入坑。
https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers
請求須要雙向證書。
注意事項:
◆ 當返回錯誤碼爲「SYSTEMERROR」時,請不要更換商戶訂單號,必定要使用原商戶訂單號重試,不然可能形成重複支付等資金風險。
◆ XML具備可擴展性,所以返回參數可能會有新增,並且順序可能不徹底遵循此文檔規範,若是在解析回包的時候發生錯誤,請商戶務必不要換單重試,請商戶聯繫客服確認付款狀況。若是有新回包字段,會更新到此API文檔中。
◆ 由於錯誤代碼字段err_code的值後續可能會增長,因此商戶若是遇到回包返回新的錯誤碼,請商戶務必不要換單重試,請商戶聯繫客服確認付款狀況。若是有新的錯誤碼,會更新到此API文檔中。
◆ 錯誤代碼描述字段err_code_des只供人工定位問題時作參考,系統實現時請不要依賴這個字段來作自動化處理。
PS:目前支持向指定微信用戶的openid付款。
官方文檔以下:
https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2
具體的傳入參數,這裏就不一一列舉了,請你們參考一下官方文檔,下面貼上具體的實現源碼:
/** * [微信支付提現接口] - 保存調用的相關記錄 * @param payment 支付對象 * @param wxPayConfig 微信支付單例對象 * @return map * * @author yclimb * @date 2018/7/30 */ public Map<String, String> saveWxPayTransfers(Payment payment, WXPayConfig wxPayConfig) throws Exception { // 支付前驗證 // 微信支付對象 // WXPay wxPay = new WXPay(WXPayConfigImpl.getInstance()); WXPay wxPay = new WXPay(wxPayConfig); // 微信退款接口 Map<String, String> resultMap = wxPay.transfers(...); logger.info("saveWxPayTransfers:resultMap:" + resultMap.toString()); // 下單失敗,進行處理 if (WXPayConstants.FAIL.equals(resultMap.get(WXPayConstants.RETURN_CODE)) || WXPayConstants.FAIL.equals(resultMap.get(WXPayConstants.RESULT_CODE))) { // 處理結果返回,無需繼續執行 // 餘額不足提醒 if (WXPayCodeEnum.ERR_CODE_NOTENOUGH.getCode().equals(resultMap.get(WXPayConstants.ERR_CODE))) { // 發送餘額不足的消息提醒 } } // 付款記錄修改 & 記錄付款日誌 return resultMap; }
以上爲調用的應用方法,下面爲你們貼出微信接口調用代碼 imall.weixin.sdk.WXPay
:
/** * 做用:企業向微信用戶我的付款<br> * 場景:企業付款爲企業提供付款至用戶零錢的能力,支持經過API接口付款,或經過微信支付商戶平臺(pay.weixin.qq.com)網頁操做付款。 * 接口文檔地址:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2 * * @param partner_trade_no 商戶訂單號 * @param openid 用戶openid * @param amount 企業付款金額 * @param desc 企業付款描述信息 * @param spbill_create_ip 該IP可傳用戶端或者服務端的IP * @return API返回數據 * @throws Exception e */ public Map<String, String> transfers(String partner_trade_no, String openid, String amount, String desc, String spbill_create_ip) throws Exception { /** 構造請求參數數據 **/ Map<String, String> data = new HashMap<>(); // 商戶訂單號 partner_trade_no 是 10000098201411111234567890 String 商戶訂單號,需保持惟一性(只能是字母或者數字,不能包含有符號) data.put("partner_trade_no", partner_trade_no); // 用戶openid openid 是 oxTWIuGaIt6gTKsQRLau2M0yL16E String 商戶appid下,某用戶的openid data.put("openid", openid); // 校驗用戶姓名選項 check_name 是 FORCE_CHECK String NO_CHECK:不校驗真實姓名,FORCE_CHECK:強校驗真實姓名 data.put("check_name", "NO_CHECK"); // 金額 amount 是 10099 int 企業付款金額,單位爲分 data.put("amount", String.valueOf(new BigDecimal(amount).multiply(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_UP).intValue())); // 企業付款描述信息 desc 是 理賠 String 企業付款操做說明信息。必填。 data.put("desc", desc); // Ip地址 spbill_create_ip 是 192.168.0.1 String(32) 該IP同在商戶平臺設置的IP白名單中的IP沒有關聯,該IP可傳用戶端或者服務端的IP。 data.put("spbill_create_ip", spbill_create_ip); /** 如下參數爲非必填參數 **/ /*// 設備號 device_info 否 013467007045764 String(32) 微信支付分配的終端設備號 data.put("device_info", "xxx"); // 收款用戶姓名 re_user_name 可選 王小王 String 收款用戶真實姓名。(若是check_name設置爲FORCE_CHECK,則必填用戶真實姓名) data.put("re_user_name", "xxx");*/ // 微信調用接口 Map<String, String> resultMap = this.transfers(data); WXPayUtil.getLogger().info("wxPay.transfers:" + resultMap); return resultMap; }
PS:推薦數據庫中對於金額存儲爲數值單位,以分爲單位來存儲,1.1元能夠儲存爲101,這樣和微信對應,會方便不少。
對於企業付款查詢的接口,這裏就不詳細描述了,如下爲具體的官方文檔連接:
https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_3
須要的朋友,根據文檔進行接口查詢便可,非高頻接口。
企業付款到銀行卡提供由商戶直接付錢至指定銀行卡帳戶的能力,支持平臺操做及接口調用兩種方式,資金到帳速度快,使用及查詢方便。主要用來解決合理的商戶對用戶付款需求,好比:保險理賠、彩票兌換等等。
開通流程:
所需資料:開通企業付款到銀行卡功能無需提供額外的材料。
費用:此功能需收取手續費,按照單筆金額收取,每筆收取0.1%,最低1元,最高25元。
微信支付已上線企業付款至銀行卡功能。商戶能夠將商戶號餘額付款至指定的收款銀行帳戶。經過指定收款銀行帳戶戶名、卡號,以及收款銀行信息便可實現付款。
官方文檔地址:
https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=24_1&index=1
功能說明:
企業付款到銀行卡發票與交易手續費發票爲拆分單獨開具。
須要注意的是,微信支持的銀行有限,具體的支持銀行見以下連接:
https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=24_4&index=5
因此確定會出現不支持的銀行,小夥伴們在開發的時候,能夠在先後端控制用戶選擇提現銀行來解決。
平臺上手動付款流程:
https://api.mch.weixin.qq.com/mmpaysptrans/pay_bank
請求須要雙向證書。
接口介紹:
用於企業向微信用戶銀行卡付款
目前支持接口API的方式向指定微信用戶的銀行卡付款。
接口調用規則:
◆ 單商戶日限額——單日100w
◆ 單次限額——單次5w
◆ 單商戶給同一銀行卡單日限額——單日5w
注意:重點來了,首先,收款方銀行卡號enc_bank_no
、收款方用戶名enc_true_name
這兩個入參是須要 採用標準RSA算法,公鑰由微信側提供
獲得的,因此還須要先拿到這個密鑰,下面是官方文檔地址:
https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=24_7&index=4
以上文檔詳細介紹瞭如何獲得具體的密鑰方式,若是有看不明白的小夥伴,能夠直接百度 獲取RSA加密公鑰API
,能夠獲得不少示例,這裏我就不講了。
除入參和企業付款到微信用戶零錢
有所不一致以外,其餘方面都差很少,小夥伴們能夠參考上面付款到零錢的接口來實現付款到銀行卡接口。
以上爲微信餘額提現
相關的解釋和源碼,小夥伴們必定要注意看看官方文檔哦,具體的源碼能夠看做者的github,裏面對每一個方法有詳細的註釋。
若是小夥伴有遇到解決不了的問題,能夠關注做者微信公衆號,加入討論羣中發出疑問,和小夥伴們一塊兒解決哦~
預告:下一篇文章會講發放獎勵的另外一種方式 商戶平臺-現金紅包
,敬請期待!!!
若是想要提早一覽源碼的小夥伴,能夠先看看個人 github,地址以下:
`
https://github.com/YClimb/wxp...
`
關注做者微信公衆號,點擊下方討論羣
,掃碼便可加入微信支付討論羣
與小夥伴一塊兒探討哦~
到此本文就結束了,關注公衆號查看更多推送!!!