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

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

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

小程序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,请私信我,万分感激!抱拳了。。。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
根据提供的引用内容,以下是关于Spring Boot服务商分账的介绍: Spring Boot是一个用于创建独立的、基于生产级别的Spring应用程序的框架。它提供了一种快速、便的式来构建微服务和分布式系统。 服务商分账是指在支付过程中,将交易金额分给多个参与,例如平台、商户等。在Spring Boot中实现服务商分账可以使用第三支付平台的API来完成。 以下是实现Spring Boot服务商分账的一般步骤: 1. 引入依赖:在项目的pom.xml文件中添加相关依赖,例如wx-java-pay-spring-boot-starter。 2. 配置密钥和证书:根据微信支付的要求,配置V3密钥和证书文件,例如apiclient_cert.pem和apiclient_key.pem。 3. 编写业务逻辑:根据具体需求,编写处理分账的业务逻辑代码。 4. 调用支付接口:使用第三支付平台的API调用分账接口,传递相关参数,例如交易金额、参与信息等。 5. 处理分账结果:根据支付平台返回的结果,处理分账成功或失败的情况。 以下是一个示例代码,演示了如何在Spring Boot中实现服务商分账: ```java // 导入相关类和包 @RestController @RequestMapping("/payment") public class PaymentController { @Autowired private PaymentService paymentService; @PostMapping("/split") public String splitPayment(@RequestBody SplitRequest request) { // 根据请求参数构建分账请求对象 SplitRequest splitRequest = new SplitRequest(); splitRequest.setOrderId(request.getOrderId()); splitRequest.setTotalAmount(request.getTotalAmount()); splitRequest.setPartners(request.getPartners()); // 调用支付平台的分账接口 SplitResponse response = paymentService.splitPayment(splitRequest); // 处理分账结果 if (response.isSuccess()) { return "分账成功"; } else { return "分账失败:" + response.getErrorMessage(); } } } ``` 请注意,以上代码仅为示例,实际实现中需要根据具体的支付平台和业务需求进行适当的修改。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值