1. 程式人生 > >關於微信企業付款到零錢

關於微信企業付款到零錢

近日,在開發“微信企業付款到零錢”的功能。之前有過微信開發的經驗,但是第一次接觸“付款到零錢“這一塊的業務,查詢了很多的部落格資料以及走了很多的彎路。也發現“企業付款到零錢”分享的部落格並不多。特地寫了該部落格,希望對你們有幫助。個人淺薄的見解


這裡寫圖片描述
【稍微提一下:】上一篇部落格分享了“企業付款到銀行卡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

這裡寫圖片描述

五、結果演示
這裡寫圖片描述
自此,我們就學會了“企業付款到個人零錢”的開發,希望對你們有幫助
具體的、在呼叫改方法自己加上自己的業務邏輯就行了。希望對大家有幫助