關於微信企業付款到零錢
阿新 • • 發佈:2019-01-01
近日,在開發“微信企業付款到零錢”的功能。之前有過微信開發的經驗,但是第一次接觸“付款到零錢“這一塊的業務,查詢了很多的部落格資料以及走了很多的彎路。也發現“企業付款到零錢”分享的部落格並不多。特地寫了該部落格,希望對你們有幫助。個人淺薄的見解
【稍微提一下:】上一篇部落格分享了“企業付款到銀行卡API~~”文章,有位博友留言了,遇到了“產品許可權驗證失敗 請檢視您當前是否具有該產品的許可權”。這是因為沒有在微信商務後臺開通對應的功能。API裡面已經明確提示了。這裡我是建議:大家一定要先去看文件,看完再來看這篇文章。文件也就三四頁而已,也就20分鐘
一、企業付款到零錢API
https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_1
【建議還是看看】
二、開發準備
(1)證書的準備:java開發需要用到:apiclient_cert.p12證書的,在微信商戶平臺(pay.weixin.qq.com)–>賬戶設定–>API安全–>證書中下載的 。
【何時用到證書?】與支付不一樣,企業支付功能在傳送post請求的時候,需要載入自己的一個證書之後,帶著證書去請求退款才可以。這裡使用到證書–很多人不知道證書在哪裡使用
(2)瞭解好數字簽名 — 簡單來解釋,就是對自己要傳送的資料進行加密處理、換句話說假如說你要傳遞A/B/C,就對這三者進行加密。初開發者的誤區:不知道該加密什麼資料、觀看網上的部落格胡亂進行簽名,導致簽名錯誤
【溫馨提示:】數字簽名是一般開發人員容易遇到的錯誤,記住“你沒遇到數字簽名錯誤,都不好意思說自己做過微信退款支付訂單查詢等功能”。 簽名工具類見:我這裡就不貼出來了
耐心解決就行
三、API截圖解釋
~~ 開通條件:
~ 介面說明 + 是否需要證書
~ 證書說明 java開發只需要:apiclient_cert.p12
四、開發步驟如下
1、拼湊所需要傳遞的引數 map集合
2、根據要傳遞的引數生成自己的簽名
3、把簽名放到map集合中【因為簽名也要傳遞過去,看API】
4、將當前的map結合轉化成xml格式
5、傳送請求到企業付款到零錢的Api。傳送請求是一個方法來的POST
6、解析返回的xml資料===》map集合
7、根據map中的result_code AND return_code來判斷是否成功與失敗
@SuppressWarnings("unchecked") public static EnterpriceToCustomer parseXmlToMapEnterpriceToCustomer(String xml){ EnterpriceToCustomer enterpriceToCustomer = new EnterpriceToCustomer(); try { StringReader read = new StringReader(xml); // 建立新的輸入源SAX 解析器將使用 InputSource 物件來確定如何讀取 XML 輸入 InputSource source = new InputSource(read); // 建立一個新的SAXBuilder SAXBuilder sb = new SAXBuilder(); // 通過輸入源構造一個Document Document doc; doc = (Document) sb.build(source); Element root = doc.getRootElement();// 指向根節點 List<Element> list = root.getChildren(); if(list!=null&&list.size()>0){ for (Element element : list) { System.out.println("key是:"+element.getName()+",值是:"+element.getText()); if("return_code".equals(element.getName())){ enterpriceToCustomer.setReturn_code(element.getText()); } if("return_msg".equals(element.getName())){ enterpriceToCustomer.setReturn_msg(element.getText()); } if("mchid".equals(element.getName())){ enterpriceToCustomer.setMchid(element.getText()); } if("nonce_str".equals(element.getName())){ enterpriceToCustomer.setNonce_str(element.getText()); } if("result_code".equals(element.getName())){ enterpriceToCustomer.setResult_code(element.getText()); } if("partner_trade_no".equals(element.getName())){ enterpriceToCustomer.setPartner_trade_no(element.getText()); } if("payment_no".equals(element.getName())){ enterpriceToCustomer.setPayment_no(element.getText()); } if("payment_time".equals(element.getName())){ enterpriceToCustomer.setPayment_time(element.getText()); } //錯誤的編碼 /* private String err_code; private String err_code_des; * */ if("err_code".equals(element.getName())){ enterpriceToCustomer.setErr_code(element.getText()); } if("err_code_des".equals(element.getName())){ enterpriceToCustomer.setErr_code_des(element.getText()); } } } } catch (JDOMException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }catch (Exception e) { e.printStackTrace(); } return enterpriceToCustomer; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
@Test
public void OldBook(){
//1.0 拼湊企業支付需要的引數
String appid = wxconfig.AppID; //微信公眾號的appid
String mch_id = wxconfig.mch_id; //商戶號
String nonce_str = RandomStringGenerator.getRandomStringByLength(32); //生成隨機數
String partner_trade_no = RandomStringGenerator.getRandomStringByLength(32); //生成商戶訂單號
String openid = "oYiAh0ypHoaYFoVFhAsnv1aJ****"; // 支付給使用者openid
String check_name = "NO_CHECK"; //是否驗證真實姓名呢
String re_user_name = "小鄭"; //收款使用者姓名
String amount = "100"; //企業付款金額,單位為分
String desc = "測試開發,稍後會還給公司的"; //企業付款操作說明資訊。必填。
String spbill_create_ip = "192.168.**.****; //
//2.0 生成map集合
SortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();
packageParams.put("mch_appid", appid); //微信公眾號的appid
packageParams.put("mchid", mch_id); //商務號
packageParams.put("nonce_str",nonce_str); //隨機生成後數字,保證安全性
packageParams.put("partner_trade_no",partner_trade_no); //生成商戶訂單號
packageParams.put("openid",openid); // 支付給使用者openid
packageParams.put("check_name",check_name); //是否驗證真實姓名呢
packageParams.put("re_user_name",re_user_name);//收款使用者姓名
packageParams.put("amount",amount); //企業付款金額,單位為分
packageParams.put("desc",desc); //企業付款操作說明資訊。必填。
packageParams.put("spbill_create_ip",spbill_create_ip); //呼叫介面的機器Ip地址
//3.0 生成自己的簽名
String sign = WeixinPayBack.createSign("utf-8",packageParams);
//4.0 封裝退款物件
packageParams.put("sign", sign);
//5.0將當前的map結合轉化成xml格式
String reuqestXml = WXPayUtil.getRequestXml(packageParams);
//6.0獲取需要傳送的url地址
String wxUrl = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers"; //獲取退款的api介面
try {
String weixinPost = ClientCustomSSL.doRefund(wxUrl, reuqestXml).toString();
//7.0 解析返回的xml資料
com.fh.entity.nrb.xiaozheng.EnterpriceToCustomer refundResult = WeixinPayBack.parseXmlToMapEnterpriceToCustomer(weixinPost);
if("SUCCESS".equalsIgnoreCase(refundResult.getResult_code()) && "SUCCESS".equalsIgnoreCase(refundResult.getReturn_code())){
//8表示退款成功
//TODO 執行成功付款後的業務邏輯
//return successPayMoneyByBankCard(submitMoney,cmms_amt,enterpriceToCustomerByCard,applyId,companyId);
}else{
//9 表示退款失敗
//TODO 呼叫service的方法 ,儲存失敗提現的記錄咯
//failToPayMoneyByBankCard(enterpriceToCustomerByCard,applyId);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
五、結果演示
自此,我們就學會了“企業付款到個人零錢”的開發,希望對你們有幫助
具體的、在呼叫改方法自己加上自己的業務邏輯就行了。希望對大家有幫助