企業付款到零錢API開發~~~ 付款到微信
阿新 • • 發佈:2019-01-10
近日,在開發“微信企業付款到零錢”的功能。之前有過微信開發的經驗,但是第一次接觸“付款到零錢“這一塊的業務,查詢了很多的部落格資料以及走了很多的彎路。也發現“企業付款到零錢”分享的部落格並不多。特地寫了該部落格,希望對你們有幫助。個人淺薄的見解
資料下載:目前資料已經刪除了,之前有網友吐槽說:資料不全,那就不共享了。也有很多網友加了我qq拿資,諮詢怎麼做,目前已經解答了有50多位網友的問題了,本人的精力有限,沒辦法顧及所有網友的問題,所以原始碼將不再開源。如果有需要加我qq:924155240。發個15~20塊吃飯錢,可以把原始碼發給你+稍稍解答問題
【稍微提一下:】上一篇部落格分享了“企業付款到銀行卡API~~”文章,有位博友留言了,遇到了“產品許可權驗證失敗 請檢視您當前是否具有該產品的許可權”。這是因為沒有在微信商務後臺開通對應的功能。API裡面已經明確提示了。這裡我是建議:大家一定要先去看文件,看完再來看這篇文章。文件也就三四頁而已,也就20分鐘
一、企業付款到零錢API
【建議還是看看】
二、開發準備
(1)證書的準備:java開發需要用到:apiclient_cert.p12證書的,在微信商戶平臺(pay.weixin.qq.com)–>賬戶設定–>API安全–>證書中下載的 。
【何時用到證書?】與支付不一樣,企業支付功能在傳送post請求的時候,需要載入自己的一個證書之後,帶著證書去請求退款才可以。這裡使用到證書–很多人不知道證書在哪裡使用
(2)瞭解好數字簽名 — 簡單來解釋,就是對自己要傳送的資料進行加密處理、換句話說假如說你要傳遞A/B/C,就對這三者進行加密。初開發者的誤區:不知道該加密什麼資料、觀看網上的部落格胡亂進行簽名,導致簽名錯誤
耐心解決就行
(3) xml到map、map到xml轉化、傳送Post請求、簽名等操作。具體見下篇文章。方法和類都分享出來了,copy即可
三、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來判斷是否成功與失敗
不得不再囉嗦一下。下面設計到簽名、mapToXml轉化、xmlToMap轉化、傳送請求到API。這些方法都可以在下面網址看到。這裡我Xml轉化成Map。我是習慣用一個Bean接收,也有範例的程式碼,大家模仿能力要強一點。這次貼出來給大家看看吧
@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;
}
@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();
}
}
五、結果演示
自此,我們就學會了“企業付款到個人零錢”的開發,希望對你們有幫助
具體的、在呼叫改方法自己加上自己的業務邏輯就行了。希望對大家有幫助