2020-7-7 微信服务商支付(JSAPI)

背景

最近项目中需要用到服务商的分账功能,因为是服务商的分账,所以需要使用服务商的支付,其中遇到了一个支付签名错误问题,在这里记录一波。

文档 + 个人理解

支付文档链接:服务商支付链接

个人理解:根据个人接过的微信接口,几乎都是将参数放入Map,签名,然后转成XML,发送请求给微信,差不多就这样,复杂的就中间加点7788地操作,有些需要证书的就使用含有SSL的请求即可,下次可能会写

做过普通商户的看这

参数按照文档上的传,但是在第二次生成签名时,传的appId是子商户关联的appId,如果传的和第一次一样,就会出现支付签名错误,这两天在微信支付社区看了看,有这种错误但是一直没说法,所以如果有支付签名错误的可以看看是否是这个问题。

没做过普通商户的看这

直接贴代码,先把对应参数改了,得出参数然后写个按钮支付一下,支付成功再说

jar包:

<dependency>
    <groupId>com.github.wxpay</groupId>
    <artifactId>wxpay-sdk</artifactId>
    <version>0.0.3</version>
</dependency>

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.3.8</version>
</dependency>

代码:

import cn.hutool.core.util.IdUtil;
import cn.hutool.http.HttpRequest;
import com.github.wxpay.sdk.WXPayConstants;
import com.github.wxpay.sdk.WXPayUtil;

import java.util.HashMap;
import java.util.Map;

/**
 * @author: bb
 * @createDate: 2020/7/7
 * @version: 1.0
 */
public class PayUtil {

    public static void main(String[] args) throws Exception {
        unifiedorder();
    }

    /**
     * JSAPI下单:服务商
     */
    public static Map<String, String> unifiedorder() throws Exception {
        Map<String, String> params = new HashMap<>();
        params.put("appid", "服务商商户号的appid - 就是哪个公众号/小程序关联了这个商户号");
        params.put("mch_id", "服务商户号");
        params.put("sub_mch_id", "子商户号(特约商户) - 钱到账的商户号");
        //    不用这个,这个是服务商关联的appid下的openId,而我们通常是需要关联到某个小程序上的openId
//      params.put("openid", "该用户在服务商绑定的appid下的openid");
        //    用这个
        params.put("sub_appid", "服务商关联小程序的appid");
        params.put("sub_openid", "小程序下");
        params.put("nonce_str", WXPayUtil.generateNonceStr());  //  随机字符串
        params.put("body", "消息体,就是显示在支付后微信发消息给你的那上面的标题");
        String outTradeNo = IdUtil.fastSimpleUUID();    //  随机生成的订单号
        params.put("out_trade_no", outTradeNo);
        params.put("total_fee", "1");   //  总金额 - 单位:分
        params.put("trade_type", "JSAPI");  //  我用的是JSAPI
        params.put("profit_sharing", "Y");  //  允许分账,不填默认不允许
        params.put("notify_url", "https://edu.zxtnet.com/");    //  回调url需添加,否则好像会报错,要是外网能访问的 - 是否需要配置看情况
        String sign = WXPayUtil.generateSignature(params, "商户号的密钥");
        params.put("sign", sign);
        String reqXml = WXPayUtil.mapToXml(params);
        String resXml = HttpRequest.post(WXPayConstants.UNIFIEDORDER_URL).body(reqXml).execute().body();
        System.out.println("res:" + resXml);
        Map resultMap = WXPayUtil.xmlToMap(resXml);
        String prepay_id = (String) resultMap.get("prepay_id");
        Map<String, String> paySignMap = new HashMap<>();
        paySignMap.put("appId", (String) resultMap.get("sub_appid"));   //  这里就是子商户号关联的appId,你不写,在调用下单请求后会作为sub_appid返回
        paySignMap.put("nonceStr",  WXPayUtil.generateNonceStr());
        paySignMap.put("package", "prepay_id=" + prepay_id);
        paySignMap.put("signType", "MD5");
        paySignMap.put("timeStamp", String.valueOf((System.currentTimeMillis() / 1000)));
        String paySign = WXPayUtil.generateSignature(paySignMap, "商户号的密钥");
        paySignMap.put("paySign", paySign);
        paySignMap.forEach((x, y) -> {
            System.out.println(x + " --- " + y);
        });
        return paySignMap;
    }
}

分账

支付成功后,才可以继续使用分账功能,记住要设置为允许分账,否则不可以分账

 

 

小结

服务商的JSAPI支付和普通商户的JSAPI支付,调用接口都是一样的,只不过参数不一样,根据文档来就行,不过重要的是在服务商JSAPI中获取paySign时,用的appId是子商户的,如果不知道,根据我代码中那样获取sub_appid就行,否则就会报支付签名错误,昨天晚上就是一直卡在支付签名错误这里。

而且如果遇到错误的时候,注意要看请求回来的返回值是否有提示等内容,这样可以根据里面来进行排错,像我早上就不知道到底是哪个appId,然后看到返回值中有个sub_appid我就试了一下,结果就出来了;而且这里微信好像没说明,所以就搞得很难受,吃一堑长一智。

                                                                                                                                                                      2020-7-7 19:47

 

微信JSApi支付是指在微信公众号或小程序内使用JSAPI调起微信支付功能,实现用户在微信内完成付款的一种方式。以下是常见的问题及解决方法: 1. 支付时提示“商户订单号重复” 解决方法:修改商户订单号,确保每笔订单的商户订单号唯一。 2. 支付时提示“支付金额与订单金额不一致” 解决方法:检查订单金额和实际支付金额是否相同,确保订单金额与实际支付金额一致。 3. 支付时提示“支付失败,请稍后再试” 解决方法:检查支付参数是否正确,确保支付参数的完整性和准确性。 4. 支付时提示“当前用户未授权,请先授权登录” 解决方法:用户需要先授权登录,获取用户信息后才能进行支付操作。 5. 支付时提示“当前用户未关注公众号” 解决方法:用户需要先关注公众号,才能进行支付操作。 6. 支付时提示“商户号与appid不匹配” 解决方法:检查商户号和appid是否对应,确保商户号和appid的匹配性。 7. 支付时提示“订单已关闭” 解决方法:订单可能已经被关闭或者已经完成支付,需要重新下单。 8. 支付时提示“系统繁忙,请稍后再试” 解决方法:服务器可能正在维护或者出现故障,需要等待一段时间后再尝试支付。 以上是微信JSApi支付常见问题及解决方法,如果以上方法无法解决问题,可以联系微信支付客服进行咨询。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值