微信支付java开发
配置:
微信开发坑比较多 所以一定要按照开发文档的要求来进行开发
<开发从第三步开始>
-
公众号平台配置
-
功能设置 –> 配置其中的 ①业务域名 ② js接口安全域名 ③ 网页授权域名
-
基本配置 –> IP白名单配置
-
-
商户平台配置
-
账户中心–> 下载安全证书 上传至服务器 (http://域名/证书 能够访问)
-
API 安全–> API秘钥设置 (自定义)
-
开发配置–>支付配置–>公众号配置–>配置支付授权目录
-
-
获取code
-
- 访问路径:https://open.weixin.qq.com/connect/oauth2/authorize?
-
- 参数:appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
-
参考链接(请在微信客户端中打开此链接体验):
-
scope为snsapi_base
-
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387&redirect_uri=https%3A%2F%2Fchong.qq.com%2Fphp%2Findex.php%3Fd%3D%26c%3DwxAdapter%26m%3DmobileDeal%26showwxpaytitle%3D1%26vb2ctag%3D4_2030_5_1194_60&response_type=code&scope=snsapi_base&state=123#wechat_redirect
-
scope为snsapi_userinfo
-
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf0e81c3bee622d60&redirect_uri=http%3A%2F%2Fnba.bluewebgame.com%2Foauth_response.php&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
参数说明
微信支付java开发配置:
<开发从第三步开始>
参数说明
4. 通过code获取openid/access_token
参数说明
返回说明 正确时返回的JSON数据包如下:
. 5. 通过openid获取支付所需参数prepay_id
请求参数
. 6. 通过html(含微信h5支付js)请求后台携带openid请求统一下单接口,并由h5支付js获取支付参数完成支付
. 7. 订单详情查询,访问微信订单查询接口
. 8. 调用微信refund退款接口
准备工作:
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
4. 通过code获取openid/access_token
-
`如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE `
redirect_uri:第三步配置的url路径.—–第三步请求成功之后会自动跳转到此路径并携带code值
-
获取code后,请求以下链接获取access_token: https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
参数说明
参数 | 是否必须 | 说明 |
appid | 是 | 公众号的唯一标识 |
secret | 是 | 公众号的appsecret |
code | 是 | 填写第一步获取的code参数 |
grant_type | 是 | 填写为authorization_code |
返回说明
正确时返回的JSON数据包如下:
-
{ "access_token":"ACCESS_TOKEN",
-
"expires_in":7200,
-
"refresh_token":"REFRESH_TOKEN",
-
"openid":"OPENID",
-
"scope":"SCOPE" }
.
5. 通过openid获取支付所需参数prepay_id
通过访问统一下单接口连接:https://api.mch.weixin.qq.com/pay/unifiedorder
在微信支付开发文档中下载SDK与demo
请求参数
字段名 | 变量名 | 必填 | 类型 | 示例值 | 描述 |
公众账号ID | appid | 是 | String(32) | wxd678efh567hg6787 | 微信支付分配的公众账号ID(企业号corpid即为此appId) |
商户号 | mch_id | 是 | String(32) | 1230000109 | 微信支付分配的商户号 |
随机字符串 | nonce_str | 是 | String(32) | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | 随机字符串,长度要求在32位以内。推荐随机数生成算法 |
签名 | sign | 是 | String(32) | C380BEC2BFD727A4B6845133519F3AD6 | 通过签名算法计算得出的签名值,详见签名生成算法 |
商品描述 | body | 是 | String(128) | 腾讯充值中心-QQ会员充值 | 商品简单描述,该字段请按照规范传递,具体请见参数规定 |
商户订单号 | out_trade_no | 是 | String(32) | 20150806125346 | 商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-* 且在同一个商户号下唯一。详见商户订单号 |
标价金额 | total_fee | 是 | Int | 88 | 订单总金额,单位为分,详见支付金额 |
终端IP | spbill_create_ip | 是 | String(16) | 123.12.12.123 | 支持IPV4和IPV6两种格式的IP地址。调用微信支付API的机器IP |
通知地址 | notify_url | 是 | String(256) | http://www.weixin.qq.com/wxpay/pay.php | 异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。 |
交易类型 | trade_type | 是 | String(16) | JSAPI | JSAPI -JSAPI支付 NATIVE -Native支付 APP -APP支付 说明详见参数规定 |
.
6. 通过html(含微信h5支付js)请求后台携带openid请求统一下单接口,并由h5支付js获取支付参数完成支付
在html中嵌套
-
$.ajax({
-
type: "POST",
-
url: "/wechat",
-
data: {
-
"openid": "on98b1sRZcShcmKrZVYeE3VQGXTc",
-
"money": "1",
-
"ordernum": odernum
-
},
-
success: function (date) {
-
if (date.code == 200) {
-
// 微信支付必须要重新reload
-
location.reload()
-
//执行微信h5回调函数
-
var obj = {
-
"appId": xxx, //公众号名称,由商户传入
-
"timeStamp": xxx, //时间戳,自1970年以来的秒数
-
"nonceStr":xxx, //随机串
-
"package": "prepay_id=" +xxx ,//支付唯一凭证
-
"signType": "MD5", //微信签名方式:
-
"paySign":xxx, //重新生成签名
-
}
-
if (typeof WeixinJSBridge == "undefined") {
-
if (document.addEventListener) {
-
document.addEventListener('WeixinJSBridgeReady', onBridgeReady(obj), false);
-
} else if (document.attachEvent) {
-
document.attachEvent('WeixinJSBridgeReady', onBridgeReady(obj));
-
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady(obj));
-
}
-
} else {
-
onBridgeReady(obj);
-
}
-
}
-
}
-
});
-
})
-
function onBridgeReady(){
-
WeixinJSBridge.invoke(
-
'getBrandWCPayRequest', obj,
-
function(res){
-
if(res.err_msg == "get_brand_wcpay_request:ok" ){
-
// 使用以上方式判断前端返回,微信团队郑重提示:
-
//res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
-
}
-
});
-
}
.
7. 订单详情查询,访问微信订单查询接口
-
https://api.mch.weixin.qq.com/pay/orderquery
-
<param>:
-
map.put("appid", "wxf874e15f78cc84a7");//APPID
-
map.put("mch_id", "1487005412");//商户号
-
map.put("out_trade_no", "20190109162035");//订单编号
-
map.put("nonce_str", "5K8264ILTKCH16CQ2502SI8ZNMTM67VS");//随时数
.
8. 调用微信refund退款接口
-
接口链接:https://api.mch.weixin.qq.com/secapi/pay/refund
-
需要证书 .p12
-
请求参数:
-
refundMessage.put("appid", wxPayConfig.getAppID());
-
refundMessage.put("mch_id", wxPayConfig.getMchID());
-
refundMessage.put("nonce_str", WXPayUtil.generateNonceStr());
-
refundMessage.put("out_trade_no", out_trade_no);//商户订单号
-
refundMessage.put("out_refund_no", "SDTK" +String.valueOf(System.currentTimeMillis()));//商户退款单号
-
refundMessage.put("total_fee", total_fee);//订单金额
-
refundMessage.put("refund_fee", total_fee);//退款金额
-
String signature = WXPayUtil.generateSignature(refundMessage, wxPayConfig.getKey());
-
refundMessage.put("sign", signature);
准备工作:
域名/证书(1.apiclient_cert.p12:支付必须/2.MP_verify_5dkzuGfuanhFOeA8.txt)