小程序支付统一下单的坑(需要两次生成sign) java后端

最大的坑,小程序需要两次生成sign。先来看下流程

第二个坑,第一次的appid  中  i是小写的 ,第二次要大写I  又一个坑!

看下代码 我会在代码的注释详细说明

引用

import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayConstants;
import com.github.wxpay.sdk.WXPayUtil;

 

代码

public Map<String, Object> WXPayOrder(HttpServletRequest httpRequest, HttpServletResponse httpResponse,
										  @RequestParam("out_trade_no") @ApiParam(value = "商户订单号") String out_trade_no,
										  @RequestHeader("token") @ApiParam(value = "权限校验") String token,
										  @RequestParam("productId") @ApiParam(value = "商品类型") int productId,
										  @RequestParam("amount") @ApiParam(value = "商品数量") int amount,
										  HttpServletRequest request
	) throws Exception {
		Users users=userService.get(redisService.getUserId(token));
		Map<String, Object> map=new HashMap<>();
		//如果商品类型为1 那就是向钱包充值
		MyWXConfig config = new MyWXConfig();
		WXPay wxpay = new WXPay(config);
		Map<String, String> data = new HashMap<String, String>();
		data.put("body", productInfo.getProduct_desc());
		data.put("out_trade_no", out_trade_no);//商户订单号
		BigDecimal total_fee1=productInfo.getProduct_price().multiply(new BigDecimal(amount));//这个单位是元的
		BigDecimal total_fee=productInfo.getProduct_price().multiply(new BigDecimal(amount).multiply(new BigDecimal("100")));//把原来单位是元的数值保存,要存入数据库
		//微信那边是分所以乘100
		String fee=total_fee.toString();
		data.put("total_fee",  fee.split("\\.")[0]);//获取非小数部分
		data.put("spbill_create_ip", request.getRemoteAddr());
		data.put("notify_url", "***");//回调地址 
		data.put("trade_type", "JSAPI");  // 此处指定支付类型  JSAPI小程序支付  NATIVE扫码支付
		data.put("openid", users.getMk_openid());  // 此处指定支付类型  JSAPI小程序支付 todo  记得该
	
		try {
			Map<String, String> resp = wxpay.unifiedOrder(data);//这里是封装好的   把东西发给微信 
			Map<String, String> reqData=new HashMap<>();
			System.out.println(resp);
			logger.info(resp);
			logger.info("下单成功");
			String appId="***";
			String timeStamp=""+System.currentTimeMillis()/1000;//返回的要是秒级别
			String nonceStr=resp.get("nonce_str");
			String code_url=resp.get("code_url");
			String Package=resp.get("prepay_id");
			String signType="MD5";
			map=MapHelper.success();
			map.put("total_fee",total_fee1);
			map.put("appId",appId);//这里要大写
			map.put("timeStamp",timeStamp);
			map.put("nonceStr",nonceStr);
			map.put("package","prepay_id="+Package);
			map.put("signType",signType);
			reqData.put("appId","**");//二次签名所用的参数
			reqData.put("timeStamp",timeStamp);
			reqData.put("nonceStr",nonceStr);
			reqData.put("package","prepay_id="+Package);
			reqData.put("signType",signType);
			map.put("sign", WXPayUtil.generateSignature(reqData, "这里是key", SignType
					.MD5));//第二次生成sigh  同样用封装好的  
			return map;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return MapHelper.error();
	}

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值