微信公众平台开发(3) 企业付款
API地址:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_1
微信提供企业向个人付款的功能。企业通过APPID+OpenID锁定目标用户,向用户付款,因此只有关注了企业公众号的用户才能付款成功。这里企业付款的公众号可以和微信公众号相同,但公众号的收款账号和付款账号不能共享。企业付款需要下载数字证书,Java只需要商户证书文件apiclient_cert.p12。
1、将企业付款所需参数封装成MchPayInfo实体
1 public class MchPayInfo implements Serializable{ 2 3 /** 4 * 5 */ 6 private static final long serialVersionUID = 1L; 7 8 private String mch_appid; 9 private String mchid; 10 private String device_info; 11 private String nonce_str; 12 private String sign; 13 private String partner_trade_no; 14 private String openid; 15 private String check_name; 16 private String re_user_name; 17 private int amount; 18 private String desc; 19 20 //省略getter、setter方法 21 }
创建MchPayInfo:
1 /** 2 * 企业付款的xml的java对象 3 * @param params UniformOrderParams 4 * @return 5 */ 6 public static MchPayInfo createMchPayInfo(MchPayParams mchPayParams) { 7 8 String nonce_str = new StringWidthWeightRandom().getNextString(32); 9 10 MchPayInfo mchPayInfo = new MchPayInfo(); 11 12 mchPayInfo.setMch_appid("appid");//商户appid 13 mchPayInfo.setDevice_info("WEB"); 14 mchPayInfo.setAmount(mchPayParams.getAmount());//付款金额 15 mchPayInfo.setMchid("mchid");//商户mchid 16 mchPayInfo.setDesc(mchPayParams.getDesc()); 17 mchPayInfo.setNonce_str(nonce_str); 18 mchPayInfo.setOpenid(mchPayParams.getOpenid());//付款对象的openid 19 mchPayInfo.setSpbill_create_ip(mchPayParams.getSpbill_create_ip()); 20 mchPayInfo.setPartner_trade_no(mchPayParams.getPartner_trade_no());//商户订单号,需保持唯一,此值微信会不做修改返回 21 mchPayInfo.setRe_user_name(mchPayParams.getRe_user_name()); 22 mchPayInfo.setCheck_name(mchPayParams.getCheck_name()); 23 24
2、调前面写的统一的微信调用接口付款,将微信的返回结果转换成map
1 /** 2 * 企业付款 3 */ 4 @Override 5 public Map<String, String> mchPay(MchPayParams mchPayParams) { 6 //构建MchPayInfo 7 MchPayInfo mchPayInfo = CommonUtil.createMchPayInfo(mchPayParams); 8 9 //将bean转换为map 10 SortedMap<Object,Object> paras = CommonUtil.convertBean(mchPayInfo); 11 //签名 12 String sgin = CommonUtil.createSgin(paras); 13 //设置签名 14 mchPayInfo.setSign(sgin); 15 16 String xml = CommonUtil.beanToXML(mchPayInfo).replace("__", "_"). 17 replace("<![CDATA[", "").replace("]]>", ""); 18 //此处传true表示调用微信接口需要使用数字证书 19 Map<String, String> map = CommonUtil.httpsRequestToXML( 20 "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers","POST",xml,true); 21 22 return map; 23 }
3、商户系统根据微信的返回结果处理付款信息即可