wx微信支付java开发

微信支付java开发

配置:

微信开发坑比较多 所以一定要按照开发文档的要求来进行开发

<开发从第三步开始>

  1. 公众号平台配置

    • 功能设置 –> 配置其中的 ①业务域名 ② js接口安全域名 ③ 网页授权域名

       

    • 基本配置 –> IP白名单配置

       

  2. 商户平台配置

    • 账户中心–> 下载安全证书 上传至服务器 (http://域名/证书 能够访问)

       

    • API 安全–> API秘钥设置 (自定义)

       

    • 开发配置–>支付配置–>公众号配置–>配置支付授权目录

       

  3. 获取code

  1. - 访问路径:https://open.weixin.qq.com/connect/oauth2/authorize?

  2. - 参数:appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

  3.  
  4. 参考链接(请在微信客户端中打开此链接体验):

  5. scope为snsapi_base

  6. 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

  7. scope为snsapi_userinfo

  8. 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开发

配置:

微信开发坑比较多 所以一定要按照开发文档的要求来进行开发

<开发从第三步开始>

  1. 公众号平台配置

    • 功能设置 –> 配置其中的 ①业务域名 ② js接口安全域名 ③ 网页授权域名

       

    • 基本配置 –> IP白名单配置

       

  2. 商户平台配置

    • 账户中心–> 下载安全证书 上传至服务器 (http://域名/证书 能够访问)

       

    • API 安全–> API秘钥设置 (自定义)

       

    • 开发配置–>支付配置–>公众号配置–>配置支付授权目录

       

  3. 获取code

  1. - 访问路径:https://open.weixin.qq.com/connect/oauth2/authorize?

  2. - 参数:appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

  3.  
  4. 参考链接(请在微信客户端中打开此链接体验):

  5. scope为snsapi_base

  6. 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

  7. scope为snsapi_userinfo

  8. 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

参数说明

参数 是否必须 说明
appid 公众号的唯一标识
redirect_uri 授权后重定向的回调链接地址, 请使用 urlEncode 对链接进行处理
response_type 返回类型,请填写code
scope 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到暱称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 ) 拉取用户信息(需scope为 snsapi_userinfo)
state 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
/#wechat_redirect 无论直接打开还是做页面302重定向时候,必须带此参数

4. 通过code获取openid/access_token

  1. `如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE `

redirect_uri:第三步配置的url路径.—–第三步请求成功之后会自动跳转到此路径并携带code值

  1. 获取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数据包如下:

  1. { "access_token":"ACCESS_TOKEN",

  2. "expires_in":7200,

  3. "refresh_token":"REFRESH_TOKEN",

  4. "openid":"OPENID",

  5. "scope":"SCOPE" }

.

5. 通过openid获取支付所需参数prepay_id

  1. 通过访问统一下单接口连接:https://api.mch.weixin.qq.com/pay/unifiedorder

  2. 在微信支付开发文档中下载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中嵌套

  1. $.ajax({

  2. type: "POST",

  3. url: "/wechat",

  4. data: {

  5. "openid": "on98b1sRZcShcmKrZVYeE3VQGXTc",

  6. "money": "1",

  7. "ordernum": odernum

  8. },

  9. success: function (date) {

  10. if (date.code == 200) {

  11.  
  12. // 微信支付必须要重新reload

  13. location.reload()

  14. //执行微信h5回调函数

  15. var obj = {

  16. "appId": xxx, //公众号名称,由商户传入

  17. "timeStamp": xxx, //时间戳,自1970年以来的秒数

  18. "nonceStr":xxx, //随机串

  19. "package": "prepay_id=" +xxx ,//支付唯一凭证

  20. "signType": "MD5", //微信签名方式:

  21. "paySign":xxx, //重新生成签名

  22. }

  23.  
  24. if (typeof WeixinJSBridge == "undefined") {

  25. if (document.addEventListener) {

  26. document.addEventListener('WeixinJSBridgeReady', onBridgeReady(obj), false);

  27. } else if (document.attachEvent) {

  28. document.attachEvent('WeixinJSBridgeReady', onBridgeReady(obj));

  29. document.attachEvent('onWeixinJSBridgeReady', onBridgeReady(obj));

  30. }

  31. } else {

  32. onBridgeReady(obj);

  33. }

  34.  
  35. }

  36. }

  37. });

  38. })

  39.  
  40. function onBridgeReady(){

  41. WeixinJSBridge.invoke(

  42. 'getBrandWCPayRequest', obj,

  43. function(res){

  44. if(res.err_msg == "get_brand_wcpay_request:ok" ){

  45. // 使用以上方式判断前端返回,微信团队郑重提示:

  46. //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。

  47. }

  48. });

  49. }

.

7. 订单详情查询,访问微信订单查询接口

  1. https://api.mch.weixin.qq.com/pay/orderquery

  2.  
  3. <param>:

  4. map.put("appid", "wxf874e15f78cc84a7");//APPID

  5. map.put("mch_id", "1487005412");//商户号

  6. map.put("out_trade_no", "20190109162035");//订单编号

  7. map.put("nonce_str", "5K8264ILTKCH16CQ2502SI8ZNMTM67VS");//随时数

.

8. 调用微信refund退款接口

  1. 接口链接:https://api.mch.weixin.qq.com/secapi/pay/refund

  2.  
  3. 需要证书 .p12

  4.  
  5. 请求参数:

  6. refundMessage.put("appid", wxPayConfig.getAppID());

  7. refundMessage.put("mch_id", wxPayConfig.getMchID());

  8. refundMessage.put("nonce_str", WXPayUtil.generateNonceStr());

  9. refundMessage.put("out_trade_no", out_trade_no);//商户订单号

  10. refundMessage.put("out_refund_no", "SDTK" +String.valueOf(System.currentTimeMillis()));//商户退款单号

  11. refundMessage.put("total_fee", total_fee);//订单金额

  12. refundMessage.put("refund_fee", total_fee);//退款金额

  13. String signature = WXPayUtil.generateSignature(refundMessage, wxPayConfig.getKey());

  14. refundMessage.put("sign", signature);

准备工作:

  1. 域名/证书(1.apiclient_cert.p12:支付必须/2.MP_verify_5dkzuGfuanhFOeA8.txt)

   
     
     
     
     
     
     

4. 通过code获取openid/access_token

  1. `如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE `

redirect_uri:第三步配置的url路径.—–第三步请求成功之后会自动跳转到此路径并携带code值

  1. 获取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数据包如下:

  1. { "access_token":"ACCESS_TOKEN",

  2. "expires_in":7200,

  3. "refresh_token":"REFRESH_TOKEN",

  4. "openid":"OPENID",

  5. "scope":"SCOPE" }

.

5. 通过openid获取支付所需参数prepay_id

  1. 通过访问统一下单接口连接:https://api.mch.weixin.qq.com/pay/unifiedorder

  2. 在微信支付开发文档中下载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中嵌套

  1. $.ajax({

  2. type: "POST",

  3. url: "/wechat",

  4. data: {

  5. "openid": "on98b1sRZcShcmKrZVYeE3VQGXTc",

  6. "money": "1",

  7. "ordernum": odernum

  8. },

  9. success: function (date) {

  10. if (date.code == 200) {

  11.  
  12. // 微信支付必须要重新reload

  13. location.reload()

  14. //执行微信h5回调函数

  15. var obj = {

  16. "appId": xxx, //公众号名称,由商户传入

  17. "timeStamp": xxx, //时间戳,自1970年以来的秒数

  18. "nonceStr":xxx, //随机串

  19. "package": "prepay_id=" +xxx ,//支付唯一凭证

  20. "signType": "MD5", //微信签名方式:

  21. "paySign":xxx, //重新生成签名

  22. }

  23.  
  24. if (typeof WeixinJSBridge == "undefined") {

  25. if (document.addEventListener) {

  26. document.addEventListener('WeixinJSBridgeReady', onBridgeReady(obj), false);

  27. } else if (document.attachEvent) {

  28. document.attachEvent('WeixinJSBridgeReady', onBridgeReady(obj));

  29. document.attachEvent('onWeixinJSBridgeReady', onBridgeReady(obj));

  30. }

  31. } else {

  32. onBridgeReady(obj);

  33. }

  34.  
  35. }

  36. }

  37. });

  38. })

  39.  
  40. function onBridgeReady(){

  41. WeixinJSBridge.invoke(

  42. 'getBrandWCPayRequest', obj,

  43. function(res){

  44. if(res.err_msg == "get_brand_wcpay_request:ok" ){

  45. // 使用以上方式判断前端返回,微信团队郑重提示:

  46. //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。

  47. }

  48. });

  49. }

.

7. 订单详情查询,访问微信订单查询接口

  1. https://api.mch.weixin.qq.com/pay/orderquery

  2.  
  3. <param>:

  4. map.put("appid", "wxf874e15f78cc84a7");//APPID

  5. map.put("mch_id", "1487005412");//商户号

  6. map.put("out_trade_no", "20190109162035");//订单编号

  7. map.put("nonce_str", "5K8264ILTKCH16CQ2502SI8ZNMTM67VS");//随时数

.

8. 调用微信refund退款接口

  1. 接口链接:https://api.mch.weixin.qq.com/secapi/pay/refund

  2.  
  3. 需要证书 .p12

  4.  
  5. 请求参数:

  6. refundMessage.put("appid", wxPayConfig.getAppID());

  7. refundMessage.put("mch_id", wxPayConfig.getMchID());

  8. refundMessage.put("nonce_str", WXPayUtil.generateNonceStr());

  9. refundMessage.put("out_trade_no", out_trade_no);//商户订单号

  10. refundMessage.put("out_refund_no", "SDTK" +String.valueOf(System.currentTimeMillis()));//商户退款单号

  11. refundMessage.put("total_fee", total_fee);//订单金额

  12. refundMessage.put("refund_fee", total_fee);//退款金额

  13. String signature = WXPayUtil.generateSignature(refundMessage, wxPayConfig.getKey());

  14. refundMessage.put("sign", signature);

准备工作:

域名/证书(1.apiclient_cert.p12:支付必须/2.MP_verify_5dkzuGfuanhFOeA8.txt)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章