翼支付分账交易

翼支付分账账户,带子商户交易需要填写 子商户号,其他参数带父商户的,并填写分账字段    格式 :     子商户号:金额


构建请求参数

        OnlinePayConfig config = getShopOnlinePayConfig();//获取配置信息
	int orderid = orderDTO.getAsInteger("id");//获取订单ID
	String merchantId = config.getMerchantId();
	String subMerchantId = config.getSubMerchantId();
        String orderNo = String.valueOf(orderid);
        String orderReqNo = String.valueOf(orderid);
        String orderDate = DateUtils.currentTime();
        BigDecimal priceoffinal = orderDTO.getAsBigDecimal("priceoffinal");
        
        String orderAmt = String.valueOf(new Float(priceoffinal.floatValue() * 100).intValue());
        
        String keyString=config.getBusikey();//获取交易KEY

        StringBuilder sb = new StringBuilder();//组装MAC明文串
        sb.append("MERCHANTID=").append(merchantId);
        sb.append("&ORDERNO=").append(orderNo);
        sb.append("&ORDERREQNO=").append(orderReqNo);
        sb.append("&ORDERDATE=").append(orderDate);
        sb.append("&BARCODE=").append(barcode);
        sb.append("&ORDERAMT=").append(orderAmt);
        sb.append("&KEY=").append(keyString);

        String mac = CryptTool.md5Digest(sb.toString());

        Map<String,String> paramMap = new HashMap<String, String>();//组装请求参数

        paramMap.put("merchantId", merchantId);
        if(subMerchantId==null||subMerchantId.equals("")){//如果存在子商户就用分账模式,如果不存在就直接用父商户的账号交易
        	paramMap.put("subMerchantId", "");
        }else{
        	paramMap.put("subMerchantId", subMerchantId);
        }
        paramMap.put("barcode", barcode);
        paramMap.put("orderNo", orderNo);
        paramMap.put("orderReqNo", orderReqNo);
        paramMap.put("orderDate", orderDate);
        paramMap.put("channel", config.getChannel());
        paramMap.put("busiType", config.getBusikey());
        paramMap.put("TransType", "B");
        paramMap.put("orderAmt", orderAmt);
        paramMap.put("productAmt", orderAmt);
        paramMap.put("attachAmt", "0");
        paramMap.put("goodsName", "条码支付");
        paramMap.put("storeId", config.getStoreId());
        paramMap.put("backUrl", config.getBackUrl());
        if(subMerchantId==null||subMerchantId.equals("")){//如果存在子商户就用分账模式,如果不存在就直接用父商户的账号交易
        	paramMap.put("ledgerDetail", "");
        }else{
        	paramMap.put("ledgerDetail", subMerchantId+":"+orderAmt);
        }
        paramMap.put("attach", shopid+","+userid);
        paramMap.put("mac", mac);
        
        return paramMap;

发起请求,并检验返会参数。

            httpClient = createSSLClientDefault();
	    httpPost = new HttpPost("https://webpaywg.bestpay.com.cn/barcode/placeOrder");
            List<NameValuePair> paramList = new ArrayList<NameValuePair>();
            for (String key : epayMap.keySet()) {
                paramList.add(new BasicNameValuePair(key, epayMap.get(key)));
            }
            urlEntity=new UrlEncodedFormEntity(paramList, Consts.UTF_8);

            httpPost.setEntity(urlEntity);
            httpPost.setConfig(RequestConfig.custom().setConnectTimeout(30000).setSocketTimeout(30000).build());
            response = httpClient.execute(httpPost);
            HttpEntity entity = response.getEntity();

            int statusCode = response.getStatusLine().getStatusCode();
            if(HttpStatus.SC_OK == statusCode) {
            	//如果响应码是200
            	String eResult = EntityUtils.toString(entity);
            	EpayEntity epayEntity = JSONObject.parseObject(eResult, EpayEntity.class);
            	if(epayEntity.isSuccess() && BocUtils.isNotEmpty(epayEntity.getResult())
            			&& "B".equals(epayEntity.getResult().getTransStatus())) {
            		//先做签名校验
            		OnlinePayConfig config = userFacade.getShopOnlinePayConfig(shopid, PayWayEnum.EPAY);
            		String sign = epayEntity.getResult().getSign();
            		StringBuilder sb = new StringBuilder();//组装mac加密明文串
                    sb.append("MERCHANTID=").append(config.getMerchantId());
                    sb.append("&ORDERNO=").append(epayEntity.getResult().getOrderNo());
                    sb.append("&ORDERREQNO=").append(epayEntity.getResult().getOrderReqNo());
                    sb.append("&ORDERDATE=").append(epayEntity.getResult().getOrderDate());
                    sb.append("&OURTRANSNO=").append(epayEntity.getResult().getOurTransNo());
                    sb.append("&TRANSAMT=").append(epayEntity.getResult().getTransAmt());
                    sb.append("&TRANSSTATUS=").append(epayEntity.getResult().getTransStatus());
                    sb.append("&ENCODETYPE=").append(epayEntity.getResult().getEncodeType());
                    sb.append("&KEY=").append(config.getBusikey());
                    
                    if(sign.equals(CryptTool.md5Digest(sb.toString()))) {//签名认证成功
                    	tradeFacade.execShopOrderByOnlineSuccess(Integer.parseInt(epayEntity.getResult().getOrderNo()), epayEntity.getResult().getTransAmt(),
                    			OrderPayTypeEnum.YIPAYTO, epayEntity.getResult().getOurTransNo());
                		res.setAppCode(Constants.SUCCESS);
                    }else{
            			res.setAppCode(Constants.FAIL, "翼支付支付响应签名认证失败!");
                    }
            	}else{
        			res.setAppCode(Constants.FAIL, "翼支付失败!ErrCode【"+epayEntity.getErrorCode()+"】,ErrorMsg【"+epayEntity.getErrorMsg()+"】");
            	}
            }else{
    			res.setAppCode(Constants.FAIL, "翼支付支付响应失败!状态码【"+statusCode+"】");
            }


### 微信支付分账的实现方式 微信支付分账功能允许商户将订单金额分配给多个子商户,从而满足复杂的业务场景需求。以下是关于微信支付分账的实现方式及相关文档的内容说明。 #### 1. 分账的基本流程 在实现分账功能时,需要确保支付请求中设置了分账相关参数。例如,在支付请求中设置 `settle_info` 的 `profit_sharing` 属性为 `true`,这表明该订单支持分账[^2]。支付成功后,可以通过调用分账接口完成资金分配。 #### 2. 配置依赖与环境 为了实现分账功能,首先需要引入微信支付 SDK,并正确配置相关参数。以下是一个典型的 Maven 配置示例: ```xml <dependency> <groupId>com.github.wechatpay-apiv3</groupId> <artifactId>wechatpay-apache-httpclient</artifactId> <version>0.4.7</version> </dependency> ``` 同时,需要在项目的 YAML 文件中配置微信支付的相关信息,例如: ```yaml wxpay: appId: xxxx mchId: xxx apiKey: xxxx apiV3Key: xxx baseUrl: https://api.mch.weixin.qq.com/v3 notifyUrl: http://example.com/pay/payNotify refundNotifyUrl: http://example.com/pay/refundNotify keyPemPath: apiclient_key.pem serialNo: xxxxx ``` 这些配置项包括应用编号、商户号、API 密钥、回调地址等,是实现分账功能的基础[^2]。 #### 3. 实现分账的核心接口 微信支付提供了多个分账相关的接口,主要包括以下内容: - **请求分账**:通过调用分账接口,将订单金额分配给指定的接收方。 - **查询分账结果**:用于查询某笔分账的具体执行情况。 - **分账回退**:如果分账失败或需要调整,可以通过此接口进行回退操作。 - **查询分账回退结果**:用于查询分账回退的状态。 - **解冻剩余资金**:当分账完成后,可以使用此接口解冻剩余未分配的资金。 - **查询待分金额**:获取当前订单中尚未分配的资金余额。 - **申请分账账单及下载**:用于生成和下载分账账单,便于财务对账。 以下是一个简单的分账请求代码示例(基于 PHP): ```php public static function requestProfitSharing($url, $data, $useCert = true) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, wxDataToXML($data)); if ($useCert) { curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'pem'); curl_setopt($ch, CURLOPT_SSLCERT, 'apiclient_cert.pem'); curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'pem'); curl_setopt($ch, CURLOPT_SSLKEY, 'apiclient_key.pem'); } else { curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); } $response = curl_exec($ch); curl_close($ch); return wxXMLToData($response); } ``` 上述代码实现了向微信支付服务器发送分账请求的功能,其中 `$url` 是分账接口地址,`$data` 是请求参数,`$useCert` 表示是否需要使用证书[^5]。 #### 4. 注意事项 - 在支付请求中必须设置 `profit_sharing=true`,否则无法启用分账功能[^3]。 - 确保证书路径正确,并且证书已上传至微信商户平台的 API 安全设置中[^5]。 - 支付成功后返回的字符串通常包含交易流水号等信息,需结合商户系统记录的订单号进行后续分账操作[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值