公众号的APPID、商户号MchID、商户API支付秘钥(商户平台的账户中心下:需要用户自行下载证书及安装)。
商户平台-->产品中心-->开发配置-->支付配置-->公众号支付:支付授权目录(该路径需要通过备案)
点击添加
公众号配置:参见官方支付文档
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_3
注意:以上的授权网址必须通过备案,最好开头都是统一的。比如:http://www.xxx.com/
官方文档写的很详细了https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
需要的参数
/**
* 支付
* appid 应用ID 是 String(32) wxd678efh567hg6787 微信开放平台审核通过的应用APPID
* mch_id 商户号 是 String(32) 1230000109 微信支付分配的商户号
* nonce_str 随机字符串 是 String(32) 5K8264ILTKCH16CQ2502SI8ZNMTM67VS 随机字符串,不长于32位。推荐随机数生成算法
* sign 签名 是 String(32) C380BEC2BFD727A4B6845133519F3AD6 签名,详见签名生成算法
* body 商品描述 是 String(128) 腾讯充值中心-QQ会员充值 商品描述交易字段格式根据不同的应用场景按照以下格式:APP——需传入应用市场上的APP名字-实际商品名称,天天爱消除-游戏充值。
* out_trade_no 商户订单号 是 String(32) 20150806125346 商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一。详见商户订单号
* total_fee 总金额 是 Int 888 订单总金额,单位为分,详见支付金额
* spbill_create_ip 终端IP 是 String(16) 123.12.12.123 用户端实际ip
* notify_url 通知地址 是 String(256) http://www.weixin.qq.com/wxpay/pay.php 接收微信支付异步通知回调地址,通知url必须为直接可访问的url,不能携带参数。
* openid 用户标识String(128) 是 oUpF8uMuAJO_M2pxb1Q9zNjWeS6o
* trade_type=JSAPI时(即公众号支付),此参数必传,此参数为微信用户在商户对应appid下的唯一标识。openid如何获取,可参考【获取openid】。企业号请使用【企业号OAuth2.0接口】获取企业号内成员userid,再调用【企业号userid转openid接口】进行转换
* @throws Exception
*/
获取openId的可以去我的另一篇博客:静默式获取 https://blog.csdn.net/qq_38423105/article/details/80632397
这边有个细节就是签名要最后签,把其余参数都带上,代码如下:
Map data = new HashMap();
data.put("appid", config.getAppID()); //公众号APPID
data.put("mch_id", config.getMchID()); //商户号
data.put("nonce_str", WXPayUtil.generateNonceStr()); //随机字符串
data.put("out_trade_no", outTradeNo); //订单号
data.put("body",body); //商品描述
data.put("total_fee", "1"); //支付金额,以分为单位
data.put("spbill_create_ip", getIpAddr(request)); //用户实际ip
data.put("notify_url", WXpayConfig.NOTIFY_URL); //支付回调地址,可以写你执行完支付想要执行的代码,比如做支付记录,交易记录
data.put("trade_type", "JSAPI"); //支付类型
data.put("openid", openId); //openId
data.put("sign", WXPayUtil.generateSignature(data,config.getKey())); //将上述信息和支付秘钥生成签名
调用微信自带的工具类WXPay, 可以打印看看有没有成功
Map resp = wxpay.unifiedOrder(data);
System.out.println("\n==========>统一下单resp:" + resp);
注意:需要二次签名,公众号支付的要求
Map resultMap = new LinkedHashMap();
resultMap.put("appid", config.getAppID()); // 应用ID
resultMap.put("partnerid", config.getMchID()); // 商户号
resultMap.put("prepayid", resp.get("prepay_id")); // 预支付交易会话ID
resultMap.put("package", "Sign=WXPay"); // 扩展字段
resultMap.put("noncestr", WXPayUtil.generateNonceStr()); // 随机字符串
resultMap.put("timestamp", String.valueOf(System.currentTimeMillis()/1000)); // 时间戳
resultMap.put("sign", WXPayUtil.generateSignature(resultMap, config.getKey())); // 签名
resultMap.put("mweb_url", resp.get("mweb_url")); //调用支付地址
System.out.println("\n==========>调起支付resp:" + resultMap);
引入wx的JS-SDK的js文件
function onBridgeReady(){
WeixinJSBridge.invoke( 'getBrandWCPayRequest', {
"appId":appId, //公众号名称,由商户传入
"timeStamp":timeStamp, //时间戳,自1970年以来的秒数
"nonceStr":nonceStr, //随机串
"package":package,
"signType":signType, //微信签名方式:
"paySign":paySign //微信签名
},
function(res){
if(res.err_msg == "get_brand_wcpay_request:ok" ) {
console.log('支付成功');
//支付成功后跳转的页面
}else if(res.err_msg == "get_brand_wcpay_request:cancel"){
console.log('支付取消');
}else if(res.err_msg == "get_brand_wcpay_request:fail"){
console.log('支付失败');
WeixinJSBridge.call('closeWindow');
} //使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
});
}
结束!!!
还不会的可以去我的资源下载:https://download.csdn.net/download/qq_38423105/10496016