前期准备:

首先要有公众号(服务号)和商户号;在微信商户平台-->产品中心-->AppID账号管理中,关联AppID账号

1、导入maven依赖

<dependency><groupId>com.github.wxpay</groupId><artifactId>wxpay-sdk</artifactId><version>0.0.3</version>
</dependency>

2、公众号设置(注:支付授权目录写到访问路径的controller的那一级就可以了,不要写到方法,页面支付授权路径直接配置页面的顶级域名即可)

3、获取openid

    @RequestMapping("/")public void wxlogin(HttpServletResponse response) {try {// 第一步:用户同意授权,获取codeString url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" +             wxAppID +"&redirect_uri=" + wxUrl+"/test/wxcallback" +"&response_type=code" +"&scope=snsapi_base" +"&state=STATE#wechat_redirect";response.sendRedirect(url);} catch (IOException e) {e.printStackTrace();}}@RequestMapping("/wxcallback")public String wxcallback(String code){// 第二步:通过code换取网页授权access_tokenString url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + wxAppID +"&secret=" + secret +"&code=" + code +"&grant_type=authorization_code";ResponseEntity<String> res = restTemplate.getForEntity(url, String.class);JSONObject jsonObject = JSONObject.parseObject(res.getBody());return jsonObject.get("openid").toString();

4、统一下单(生成签名的顺序不要变)

public Result unifiedOrderJSAPI(Map<String,Object> orderMap, HttpServletRequest request) {Map<String, String> returnMap = new HashMap<>();Map<String, String> responseMap = new HashMap<>();Map<String, String> data = new HashMap<>();String orderNo = null;try {//如果订单不为空if (orderMap != null){orderNo = orderMap.get("id").toString();Double amount = Double.parseDouble(orderMap.get("sfprice").toString());//支付参数WXPay wxpay = new WXPay(config);data.put("appid", config.getAppID());data.put("secret", config.getSecret());data.put("body", "订单支付");data.put("mch_id", config.getMchID());data.put("notify_url", config.getWxPayNotifyUrl());//异步通知地址(请注意必须是外网)data.put("out_trade_no", orderNo);data.put("spbill_create_ip", getIpAddress(request)); //自己的服务器IP地址data.put("openid", orderMap.get("openId").toString()); //openIddata.put("total_fee", String.valueOf((int) (amount * 100)));data.put("trade_type", "JSAPI");//交易类型JSAPI支付String s = WXPayUtil.generateSignature(data, config.getKey());  //签名data.put("sign", s);//签名//使用官方API请求预付订单Map<String, String> resultMap = wxpay.unifiedOrder(data);//获取返回码String returnCode = resultMap.get("return_code");//若返回码为SUCCESS,则会返回一个result_code,再对该result_code进行判断if ("SUCCESS".equals(returnCode)) {String resultCode = resultMap.get("result_code");if ("SUCCESS".equals(resultCode)) {responseMap = resultMap;}}if (responseMap == null || responseMap.isEmpty()) {return ResultUtil.error("获取预支付交易会话标识失败"+responseMap);}// 3、签名生成算法Long time = System.currentTimeMillis() / 1000;String timestamp = time.toString();returnMap.put("appId", config.getAppID());returnMap.put("nonceStr", responseMap.get("nonce_str"));returnMap.put("package", "prepay_id="+responseMap.get("prepay_id"));returnMap.put("signType", "MD5");returnMap.put("timeStamp", timestamp);returnMap.put("paySign", WXPayUtil.generateSignature(returnMap, config.getKey()));//微信支付签名}return ResultUtil.success(returnMap);} catch (Exception e) {logger.error("订单号:{},错误信息:{}", orderNo, e.getStackTrace());return ResultUtil.error("微信支付统一下单失败");}}

5、获取jssdk配置信息

@RequestMapping("/weixinInfo")public Result weixinInfo( @RequestBody Map<String,Object> param) {try {//1、获取AccessToken jsapi_ticketMap<String,String> tokenMap = tokenMap();String accessToken = tokenMap.get("accessToken");String jsapiTicket = tokenMap.get("ticket");//2、时间戳和随机字符串String noncestr = UUID.randomUUID().toString().replace("-", "").substring(0, 16);//随机字符串String timestamp = String.valueOf(System.currentTimeMillis() / 1000);//时间戳//3、获取urlString url = config.getUrl();//4、将参数排序并拼接字符串String str = "jsapi_ticket=" + jsapiTicket + "&noncestr=" + noncestr + "&timestamp=" + timestamp + "&url=" + param.get("url");logger.info("参数拼接的字符串:" + str);//5、将字符串进行sha1加密String signature = SHA1(str);logger.info("签名:" + signature);Map<String, Object> data = new HashMap<>();data.put("timestamp", timestamp);data.put("nonceStr", noncestr);data.put("signature", signature);data.put("accessToken", accessToken);data.put("appId", config.getAppID());return ResultUtil.success(data);} catch (Exception e) {logger.error("获取微信信息的错误", e);return ResultUtil.error("获取微信信息的错误");}}public String getAccessToken(){String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" + "&appid=" + config.getAppID() + "&secret="+ config.getSecret();ResponseEntity<String> res = restTemplate.getForEntity(url, String.class);JSONObject jsonObject = JSONObject.parseObject(res.getBody());String accessToken = jsonObject.getString("access_token");redisTemplate.opsForValue().set("accessToken",accessToken,2L, TimeUnit.HOURS);return  accessToken;}public String getTicket(String accessToken){String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + accessToken + "&type=jsapi";// 这个url链接和参数不能变ResponseEntity<String> res = restTemplate.getForEntity(url, String.class);JSONObject jsonObject = JSONObject.parseObject(res.getBody());String ticket = jsonObject.getString("ticket");redisTemplate.opsForValue().set("ticket",ticket,2L, TimeUnit.HOURS);return  ticket;}public Map<String,String> tokenMap(){Map<String,String> tokenMap=new HashMap<>();String accessToken = null;String ticket = null;if (redisTemplate.opsForValue().get("access_token") != null){accessToken = redisTemplate.opsForValue().get("access_token").toString();}else{accessToken = getAccessToken();}if (redisTemplate.opsForValue().get("ticket") != null){ticket = redisTemplate.opsForValue().get("ticket").toString();}else{ticket = getTicket(accessToken);}tokenMap.put("accessToken",accessToken);tokenMap.put("ticket",ticket);return tokenMap;}public static String SHA1(String decript) {try {MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1");digest.update(decript.getBytes());byte messageDigest[] = digest.digest();// Create Hex StringStringBuffer hexString = new StringBuffer();// 字节数组转换为 十六进制 数for (int i = 0; i < messageDigest.length; i++) {String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);if (shaHex.length() < 2) {hexString.append(0);}hexString.append(shaHex);}return hexString.toString();} catch (NoSuchAlgorithmException e) {logger.error("SHA1发生错误", e);}return "";}

6、支付页面

<script src="http://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>
<script src="http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></script><script>// 进入页面 首先判断是否已经授过权var baseUrl = function (n) {return 'http://test.com/' + n}var openID = "${openid}";var param = "${param?default('')}";var courseId = "${courseId?default('')}";if (!openID) {// 没有授权 去授权setTimeout(function () {window.location.href = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=appid&redirect_uri=' + baseUrl('/test/wxcallback?param=') + param + '&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect'}, 0)}(function ($) {if (!openID) {return}var data = {url: window.location.href};//获取jssdk$.ajax({url: baseUrl('/wxpay/weixinInfo'),type: "post",dataType: "json",contentType: "application/json;charset=utf-8",data: JSON.stringify(data),success: function (res) {getWeShare(res)},error: function () {toast('服务器错误,请重试')}});var getWeShare = function (data) {var code, params;code = data.code;params = data.data;if (code < 0) {return;}wx.config({debug: false,appId: params.appId, // 必填,公众号的唯一标识nonceStr: params.nonceStr, // 必填,生成签名的随机串signature: params.signature, // 必填,签名timestamp: params.timestamp, //必填 签名的时间戳jsApiList: ['chooseWXPay',   //权限列表只需要微信支付即可]})wx.ready(function () {// 页面渲染完毕渲染js$("#pay").click(function () {var data, url;if (courseId) {url = baseUrl('/wxpay/unifiedOrderJSAPI')data = {courseId: courseId}}data.openId = "${openid}";data.userId = "${uId}";$.ajax({url: url,type: "post",dataType: "json",contentType: "application/json;charset=utf-8",data: JSON.stringify(data),success: function (res) {if (!res.code) {wx.chooseWXPay({timestamp: res.data.timeStamp,package: res.data.package,nonceStr: res.data.nonceStr,signType: res.data.signType,paySign: res.data.paySign,success: function (res) {console.log("拉去微信支付成功");console.log('res===>  ', res)}});}else{alert(res.msg);}}})});})}})(Zepto)</script>

JSAPI微信支付java相关推荐

  1. 微信支付-java实现微信支付-后端篇

    微信支付系列文章 微信支付-java后端实现 微信支付-vue 前端实现 java demo: 下载地址文章底部 技术栈 Spring boot java XML (微信在http协议中数据传输方案) ...

  2. 微信支付 JAVA实现

    微信支付接口文档2.7里的demo实在是看不下去了,错误百出,到网上搜了半天,全部都是把官方文档下下来让你下载,还扣你积分,操蛋... 微信支付JAVA 接口 首先下载官方demo,虽然很多有问题,但 ...

  3. java微信web支付开发_微信支付java开发详细第三方支付功能开发之支付宝web端支...

    这段时间把支付基本搞完了,因为做的过程中遇到许多问题,特地记录下来,同时方便其他java coder,废话少说,下面开始. 整体思路:在后台,根据参数创建支付宝客户端AlipayClient,发送参数 ...

  4. 微信刷卡 sdk java_微信支付 Java SDK

    微信支付 Java SDK 对微信支付开发者文档中给出的API进行了封装. com.github.wxpay.sdk.WXPay类下提供了对应的方法: 方法名 说明microPay 刷卡支付 unif ...

  5. java微信支付代码_10行代码搞定微信支付(Java版)

    原标题:10行代码搞定微信支付(Java版) 微信支付痛点 对于大多数同学来说,要开发微信支付可不简单.附上微信支付官方文档网页链接 从文档上可以看出,你需要解决很多问题,我就随便挑几个吧. xml与 ...

  6. 微信支付查询订单java_微信支付java版本之查询订单

    本文实例为大家分享了微信支付订单的查询接口,供大家参考,具体内容如下 1.接口简介 2.代码实现 package com.zhrd.bussinss.platform.controller.shop; ...

  7. app微信支付-java服务端接口 支付/查询/退款

    app微信支付-java服务端接口 支付-查询-退款 个人看微信的文档,看了很多前辈的写法,终于调通了,在这里做一下记录. 首先来定义各种处理类(微信支付不需要特殊jar包,很多处理需要自己封装,当然 ...

  8. 微信支付java版v2.0_刷卡支付-翟东平-专题视频课程

    微信支付java版v2.0_刷卡支付-1814人已学习 课程介绍         微信支付系列课程将讲解"刷卡支付"."扫码支付"."公众号支付&qu ...

  9. 视频教程-企业微信支付JAVA版_向员工收款-微信开发

    企业微信支付JAVA版_向员工收款 微信企业号星级会员.10多年软件从业经历,国家级软件项目负责人,主要从事软件研发.软件企业员工技能培训.已经取得计算机技术与软件资格考试(软考)--"信息 ...

  10. JSAPI微信支付开发流程和坑

    首先,我先简要说明一下微信支付开发的流程 众所周知,工欲善其事,必先利其器,微信官方推出了web微信开发工具,有windows.linux.版本的,根据自己的开发环境选择合适自己的,登陆公众平台--& ...

最新文章

  1. 笔记本电脑真香,包邮送一台!
  2. couchdb 视图操作_couchDB视图
  3. 【转】数据库的锁机制
  4. 如何获得当前运行模块在进程地址空间的位置
  5. c# WebApi之身份验证:Basic基础认证
  6. php获取上传多个文件缺失
  7. 与微软.NET创始人Scott Guthrie面对面,“红衣教主”亲身传授推动成功转型的洪荒之力
  8. 容器+AOP实现动态部署(四)
  9. python大列表分割成小列表_Python有什么方法将列表分割成大小均匀的块?求使用实例...
  10. linux运维正则表达式技术分享
  11. C语言博客作业---嵌套循环
  12. AngularJS从构建项目开始
  13. 2022.9.19-9.25 AI行业周刊(第116期):告别
  14. 并查集:A bug's life
  15. 间歇性孤独症,我喜欢的,是你刚好在我身边
  16. java lifo_java:stack栈: Stack 类表示后进先出(LIFO)的对象堆栈
  17. 手势识别整体设计流程方案
  18. smaba(跨平台文件共享)
  19. 【CSS-定位和浮动】
  20. 桌面上的街舞之基础篇(09-04-29)

热门文章

  1. 2020,网络安全领域有什么新趋势
  2. Session ArrayList 实现购物车程序
  3. 电感的主要特性参数介绍
  4. 张涵诚:龙头企业应承担起产业数据生态构建的重任
  5. Apollo在基础架构中的实践经验
  6. html 实现b站弹幕,可实现B站 蒙版弹幕 效果的前端组件 —— Barrage UI
  7. JavaScript中this的指向总结
  8. LED驱动电路设计及原理分析
  9. ansible中的file、cron、debug、template、lineinfile、blockinfile模块的介绍和使用
  10. ubuntu美化之conky美化