微信支付对接【踩坑实录】

微信支付对接【踩坑实录】

公众号支付

必备条件

  • 拥有一个认证过的公众号
  • 公众号开通微信支付

注意点

  • timestamp参数js使用的是小写,后台签名使用的是timeStamp(大写S)
  • 签名算法必须使用MD5,并且下单的签名算法也必须是MD5(微信的demo sdk留下一个巨大的坑,判定Sandbox环境使用MD5,其他环境使用HMACSHA256)这个地方我改了sdk代码,写死MD5
  • timestamp时间戳规则,这里是精确到秒,不是毫秒

环境配置

  1. 公众号配置

在公众号设置-功能设置,配置网页授权域名,JS接口安全域名,业务域名

  1. 微信商品平台,支付配置
  • 普通商户在产品中心-开发配置中设置支付授权目录
  • 服务商在服务商功能-特约商户管理中设置支付授权目录

页面开发

  1. 页面JS授权
$.getJSON(_ctx+'/wx/outh/sign?url=' + encodeURIComponent(location.href.split('#')[0]), function (res) {
        wx.config({
            debug: false,
            appId: res.appId,
            timestamp: res.timestamp,
            nonceStr: res.nonceStr,
            signature: res.signature,
            jsApiList: [
                'chooseWXPay'
            ]
        });
});
  1. 后台下单及参数签名
WxpayVo wxpayVo=new WxpayVo();
//注意:这里的时间戳是秒,不是毫秒
String timestamp = String.valueOf(System.currentTimeMillis()/1000);
String nonceStr = RandomUtils.generateString(8);
String appId = Config.instance().getAppid();
//这里不是公众号的密钥,而是微信商户平台的密钥
String appSecret = DictUtil.getValue("wxpay_info", "private_key");
wxpayVo.setAppId(appId);
wxpayVo.setNonceStr(nonceStr);
wxpayVo.setTimestamp(timestamp);
wxpayVo.setSignType("MD5");
String packageStr ="prepay_id="+order.getAuthCode();
wxpayVo.setPrepayId(packageStr);
Map<String, String> params = new HashMap<String, String>();
// Step1:准备签名参数,注意参数大小写
params.put("nonceStr", nonceStr);
params.put("timeStamp", timestamp);
params.put("appId", appId);
params.put("package", packageStr);
params.put("signType", "MD5");
// Step签名
String paySign = Signature.getSign(params,appSecret);
logger.info(paySign);
wxpayVo.setPaySign(paySign);
  1. 唤起支付窗口
$('#btn_topup').on('click',function(){
	 $.getJSON(_ctx+'/wx/pay/unifiedorder',{totalAmount:$('#totalAmount').val()}, function (res) {
		 console.log('chooseWXPay',res);
		 wx.chooseWXPay({
			    appId:res.appId,     
				timestamp: res.timestamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
				nonceStr: res.nonceStr, // 支付签名随机串,不长于 32 位
				package: res.prepayId, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)
				signType: 'MD5', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
				paySign: res.paySign, // 支付签名
				success: function (res) {
				// 支付成功后的回调函数
					console.log('success',res);
				},
				fail: function(res) {
		            //接口调用失败时执行的回调函数。
					console.log('fail',res);
		        }
			});
      });
});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

顽石九变

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值