Bootstrap

服务商模式下添加分账接收方

服务商模式下要想进行分账操作,必须先添加分账接收方,添加分账接收方有两种方式,第一种是在特约商户里添加,第二种是调用微信添加分账接收方接口
第一种实现方式:
登录特约商户商户号–交易中心–管理分账接收方–添加分账接收方
在这里插入图片描述
在这里插入图片描述

第二种方式:
小程序页面添加一个按钮
在这里插入图片描述
代码如下:

小程序js代码:

addreceiver:function(){
    var that = this;
    this.req('/interfaceController/addReceiver', {
    }, function (res) {

    });
  },

后台代码

	/**添加分账接收方*/
	public static final String addReceiverUrl="	https://api.mch.weixin.qq.com/pay/profitsharingaddreceiver";
/**
	 * 添加分账接收人
	 * @return
	 */
	@RequestMapping("/addReceiver")
	public R addReceiver(HttpServletRequest request){
		try {
			
			
			JSONObject jsonObject = new JSONObject();
			//个人的微信号
//			jsonObject.put("account", ""); //个人微信号
//			jsonObject.put("name", "");  //个人名字
//			jsonObject.put("relation_type", "STORE_OWNER");   //按照实际情况来就行
//			jsonObject.put("type", "PERSONAL_WECHATID");   //个人微信
			
			//商户号
			jsonObject.put("account", "");   //商户号
			jsonObject.put("name", " ");//商户全称
			jsonObject.put("relation_type", "BRAND"); //按照实际情况来就行
			jsonObject.put("type", "MERCHANT_ID");  //商户号
			
	    	List<NameValuePair> nvps = new ArrayList<NameValuePair>();
	    	// 调用请求单次分账接口必需传的参数
	    	nvps.add(new NameValuePair("appid","asdada"));   //服务商商户号对应服务号的appid
			nvps.add(new NameValuePair("mch_id",""));//服务商商户号
			nvps.add(new NameValuePair("nonce_str","ibuaiVcKdpRxkhJA"));
			nvps.add(new NameValuePair("receiver",jsonObject.toString()));//商户分账单号
			
	    	StringBuffer sb = new StringBuffer();
	    	
	    	for (NameValuePair nvp : nvps) {
	    		sb.append(nvp.getName() + "=" + nvp.getValue() + "&");
	    	}
	    	String signA = sb.toString(); // 根据签名格式组装数据,详见微信支付api
	    	String stringSignTemp = signA + "key=asdasdaad"; // key是服务商商户号的密钥
	    	
	    	String sign = HMACSHA256(stringSignTemp, "asdasdaad");
	    	nvps.add(new NameValuePair("sign", sign)); // 把签名后的数据组装成参数
	    	TenpayHttpClient httpClient = new TenpayHttpClient();
			httpClient.setReqContent(addReceiverUrl);
			String resContent = "";
			if (httpClient.callHttpPost(addReceiverUrl, toXml(nvps))) {
				resContent = httpClient.getResContent();
				String result = new String(resContent.getBytes("UTF-8"), "UTF-8");
				
				JSONObject xmlJSONObj = XML.toJSONObject(result);
				System.out.println(xmlJSONObj.toString());
				 JSONArray childNodes = JSONML.toJSONObject(result.toString()).getJSONArray("childNodes");  
	             int len = childNodes.length() - 1;  
	             for (int i = len; i > -1; i--) {  
	                 JSONObject js = childNodes.getJSONObject(i);  
	                 System.out.println(js.toString());
	                
	             }  
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return R.ok();
	}

// 编码转换
	public static byte[] getContentBytes(String content, String charset) {
		if (charset == null || "".equals(charset)) {
			return content.getBytes();
		}
		try {
			return content.getBytes(charset);
		} catch (UnsupportedEncodingException e) {
			throw new RuntimeException("MD5签名过程中出现错误,指定的编码集不对,您目前指定的编码集是:"
					+ charset);
		}
	}
	
	// 转换成xml格式
		private String toXml(List<NameValuePair> params) {
			StringBuilder sb = new StringBuilder();
			sb.append("<xml>");
			for (int i = 0; i < params.size(); i++) {
				sb.append("<" + params.get(i).getName() + ">");
				sb.append((params.get(i)).getValue());
				sb.append("</" + params.get(i).getName() + ">");
			}
			sb.append("</xml>");
			//System.out.println("xml数据=" + sb.toString());
			return sb.toString();
		}
	    /**
	     * 生成 HMACSHA256
	     * @param data 待处理数据
	     * @param key 密钥
	     * @return 加密结果
	     * @throws Exception
	     */
	    public static String HMACSHA256(String data, String key) throws Exception {
	        Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
	        SecretKeySpec secret_key = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256");
	        sha256_HMAC.init(secret_key);
	        byte[] array = sha256_HMAC.doFinal(data.getBytes("UTF-8"));
	        StringBuilder sb = new StringBuilder();
	        for (byte item : array) {
	            sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
	        }
	        return sb.toString().toUpperCase();
	    }

这里我是遇到一个问题:微信分账接口分账到个人微信,报无分账权限,商户平台已开通分账,并且添加了个人微信号到微信分账接收方。
官方解释:联系BD,确认权限是否开通。
然后还不告诉怎么联系BD,如果哪位小伙伴知道怎么联系BD,请私信我,万分感激!抱拳了。。。

;