1. 程式人生 > >企業付款到零錢API開發~~~ 付款到微信

企業付款到零錢API開發~~~ 付款到微信

近日,在開發“微信企業付款到零錢”的功能。之前有過微信開發的經驗,但是第一次接觸“付款到零錢“這一塊的業務,查詢了很多的部落格資料以及走了很多的彎路。也發現“企業付款到零錢”分享的部落格並不多。特地寫了該部落格,希望對你們有幫助。個人淺薄的見解
資料下載:目前資料已經刪除了,之前有網友吐槽說:資料不全,那就不共享了。也有很多網友加了我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();
		}
		
		
	}

這裡寫圖片描述

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