服务端微信支付(APP和JSAPI支付)相关问题

服务端微信支付相关问题

JSAPI开发文档

jsapi开发文档链接
app开发文档链接

统一下单参数

在开发前需要先申请商户平台申请商户号和APP支付(在开放平台申请账号)、JSAPI(在公众平台申请账号)
在开发过程中先后集成了APP支付和公众号支付(JSAPI支付)此两种支付方式统一下单的参数不同,详见下方:
共同参数:
mch_id:商户号;nonce_str:随机字符串;body:商品描述;out_trade_no:商户订单号;total_fee:订单总金额,单位为分;spbill_create_ip:终端IP;notify_url:回调地址(此地址为微信支付成功后会回调请求该地址,商户方再此处理支付成功后的业务逻辑处理)
不同参数:
appid:APP支付(开放平台ID)、JSAPI支付(公众号ID);
trade_type:APP支付(APP)、JSAPI支付(JSAPI);
openid:JSAPI支付必传此参数;

注意事项

1.当支付方式为jsapi时统一下单接口参数返回前端务必注意部分参数的大小写
如appId I是大写,signType T为大写,timeStamp S是大写,nonceStr S是大写,否则前端JS调微信SDK时会一直报验签失败
2.支付方式为jsapi时统一下单请求微信后台的参数必须有openId,每个关注过公众号用户的Openid是唯一的
3.微信授权信息调微信后台接口时需要将获取的access_token和jsapiTicket放至缓存,因为每天请求此接口有次数限制,有效期为两个小时
4.统一下单中生成签名前需要在微信商户平台中设备Key密钥

统一下单JAVA代码如下

@Override
    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
    public Map<Object,Object> saveOrder(String total, String loginUserId, String billsId,String feeType,String openId) {

        try {
            Map<Object, Object> map = new HashMap<>();
            //根据openId是否为空进行判断是app支付还是公众号支付
            if(StringUtils.isNotEmpty(openId)){
                map.put("appid", WECHAT_OFFICIAL_APPID);
                map.put("trade_type", "JSAPI");
                map.put("openid", openId);
            }else{
                map.put("appid", APPID);
                map.put("trade_type", TRADE_TYPE);
            }
            map.put("mch_id", MCHID);
            map.put("nonce_str", RandomUtil.getRandomStringByLength(32));
            map.put("body", "家半径-微信支付");
            map.put("out_trade_no", RandomUtil.getRandomStringByLength(32));

            //处理金额去除小数点
            DecimalFormat decimalFormat = new DecimalFormat("0");
            decimalFormat.setRoundingMode(RoundingMode.HALF_UP);
            BigDecimal big = new BigDecimal(total).multiply(new BigDecimal("100"));

            map.put("total_fee", Integer.parseInt(decimalFormat.format(big)));
            map.put("spbill_create_ip", RandomUtil.getHostIp());
            if(billsId==""){
                map.put("notify_url", SHOW_NOTIFY_URL);
            }else{
                map.put("notify_url", NOTIFY_URL);
            }

            //根据算法生成签名
            String sign = Md5EncryptUtil.getWechatSign(map, KEY_APPSECRET);
            map.put("sign", sign);
            //将参数转换成xml
            String paramXML &
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值