企业付款到零钱API开发~~~ 付款到微信

近日,在开发“微信企业付款到零钱”的功能。之前有过微信开发的经验,但是第一次接触“付款到零钱“这一块的业务,查询了很多的博客资料以及走了很多的弯路。也发现“企业付款到零钱”分享的博客并不多。特地写了该博客,希望对你们有帮助。个人浅薄的见解

代码下载地址如下:
链接:https://pan.baidu.com/s/1h6_ZSz5RbFARlY9yxkvj5w
提取码:weft
有任何关于微信开发的问题可以相互交流, 推荐QQ:2172931891 , 另外有微商城、微分销、微信小游戏等系统源码,有需要可以联系免费提供。
在这里插入图片描述
【稍微提一下:】上一篇博客分享了“企业付款到银行卡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,就对这三者进行加密。初开发者的误区:不知道该加密什么数据、观看网上的博客胡乱进行签名,导致签名错误
【温馨提示:】数字签名是一般开发人员容易遇到的错误,记住“你没遇到数字签名错误,都不好意思说自己做过微信退款支付订单查询等功能”。 签名工具类见:我这里就不贴出来了
http://blog.csdn.net/xiaozhegaa/article/details/79127283

耐心解决就行
(3) xml到map、map到xml转化、发送Post请求、签名等操作。具体见下篇文章。方法和类都分享出来了,copy即可
http://blog.csdn.net/xiaozhegaa/article/details/79127283

三、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接收,也有范例的代码,大家模仿能力要强一点。这次贴出来给大家看看吧
http://blog.csdn.net/xiaozhegaa/article/details/79127283

@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();
		}
		
		
	}

这里写图片描述

五、结果演示
这里写图片描述
自此,我们就学会了“企业付款到个人零钱”的开发,希望对你们有帮助
具体的、在调用改方法自己加上自己的业务逻辑就行了。希望对大家有帮助

  • 12
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 54
    评论
评论 54
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值