如何编写Java代码实现调用微信支付功能示例?
- 内容介绍
- 文章标签
- 相关推荐
本文共计2118个文字,预计阅读时间需要9分钟。
Java结合微信支付和百度搜素,描述不够清晰。建议自己编写一个示例,以便今后直接修改使用。由于涉及前端展示和二维码生成,以下是一个简单的示例:
一. 准备工作
1. 创建一个Java项目,添加必要的依赖库(如微信支付SDK、二维码生成库等)。
2.配置微信支付的相关参数(如商户ID、API密钥等)。
二. 示例代码
java
// 微信支付示例代码public class WeChatPayExample { public static void main(String[] args) { // 微信支付参数 String appId=your_app_id; String partnerId=your_partner_id; String partnerKey=your_partner_key; String notifyUrl=your_notify_url;// 构建支付请求参数 Map payParams=new HashMap(); payParams.put(appid, appId); payParams.put(partnerid, partnerId); payParams.put(openid, your_openid); payParams.put(body, 商品描述); payParams.put(out_trade_no, 订单号); payParams.put(total_fee, 1); payParams.put(spbill_create_ip, your_ip); payParams.put(notify_url, notifyUrl); payParams.put(trade_type, JSAPI);
// 生成签名 String sign=generateSign(payParams, partnerKey);
// 构建支付请求JSON字符串 String payJson={\appid\:\ + appId + \,\partnerid\:\ + partnerId + \,\openid\:\ + your_openid + \,\body\:\商品描述\,\out_trade_no\:\ + 订单号 + \,\total_fee\:\1\,\spbill_create_ip\:\ + your_ip + \,\notify_url\:\ + notifyUrl + \,\trade_type\:\JSAPI\,\sign\:\ + sign + \};
// 发送支付请求(此处省略具体实现) // ...
// 二维码生成示例代码 String qrCodeUrl=https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=your_access_token; Map qrCodeParams=new HashMap(); qrCodeParams.put(expire_seconds, 600); qrCodeParams.put(action_name, QR_LIMIT_STR_SCENE); qrCodeParams.put(scene_str, 商品描述);
// 生成签名 String qrCodeSign=generateSign(qrCodeParams, your_secret_key);
// 构建二维码请求JSON字符串 String qrCodeJson={\expire_seconds\:\600\,\action_name\:\QR_LIMIT_STR_SCENE\,\scene_str\:\商品描述\,\sign\:\ + qrCodeSign + \};
// 发送二维码请求(此处省略具体实现) // ... }
// 生成签名 private static String generateSign(Map params, String key) { // 按字典序排序参数 List keys=new ArrayList(params.keySet()); Collections.sort(keys);
// 构建签名原文 StringBuilder signStr=new StringBuilder(); for (String key : keys) { signStr.append(key).append(=).append(params.get(key)).append(&); } signStr.append(key=).append(key);
// 生成签名 return MD5(signStr.toString()).toUpperCase(); }
// MD5加密 private static String MD5(String str) { try { MessageDigest md=MessageDigest.getInstance(MD5); md.update(str.getBytes()); byte[] digest=md.digest(); StringBuilder sb=new StringBuilder(); for (byte b : digest) { sb.append(String.format(%02x, b)); } return sb.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return null; } }}
三. 使用说明
1. 将示例代码中的参数替换为实际参数。
2.根据需要修改代码,实现支付请求和二维码请求的具体实现。
3.将生成的支付链接和二维码展示在前端页面。
通过以上步骤,您可以实现一个简单的Java结合微信支付和百度搜素的示例。
Java 使用微信支付
前言百度搜了一下微信支付,都描述的不太好,于是乎打算自己写一个案例,希望以后拿来直接改造使用。
因为涉及二维码的前端显示,所以有前端的内容
一. 准备工作
所需微信公众号信息配置
- APPID:绑定支付的APPID(必须配置)
- MCHID:商户号(必须配置)
- KEY:商户支付密钥,参考开户邮件设置(必须配置)
- APPSECRET:公众帐号secert(仅JSAPI支付的时候需要配置)
我这个案例用的是尚硅谷一位老师提供的,这里不方便提供出来,需要大家自己找,或者公司提供
二. 构建项目架构
1.新建maven项目
2.导入依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.1.RELEASE</version> </parent> <dependencies> <!--spring boot --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--微信提供的sdk--> <dependency> <groupId>com.github.wxpay</groupId> <artifactId>wxpay-sdk</artifactId> <version>0.0.3</version> </dependency> <!--发送api.mch.weixin.qq.com/pay/unifiedorder"); //设置xml格式的参数 //把xml格式的数据加密 client.setXmlParam(WXPayUtil.generateSignedXml(m, WxPayUtils.WX_PAY_PARTNER_KEY)); client.setHttps(true); //执行post请求发送 client.post(); //4 得到发送请求返回结果 //返回内容,是使用xml格式返回 String xml = client.getContent(); //把xml格式转换map集合,把map集合返回 Map<String,String> resultMap = WXPayUtil.xmlToMap(xml); //最终返回数据 的封装 Map map = new HashMap(); map.put("no", no); map.put("price", price); map.put("result_code", resultMap.get("result_code")); map.put("code_url", resultMap.get("code_url")); model.addAttribute("map",map); return "pay"; } @GetMapping("queryorder/{no}") @ResponseBody public String queryPayStatus(@PathVariable String no) throws Exception{ //1、封装参数 Map m = new HashMap<>(); m.put("appid", WxPayUtils.WX_PAY_APP_ID); m.put("mch_id", WxPayUtils.WX_PAY_PARTNER); m.put("out_trade_no", no); m.put("nonce_str", WXPayUtil.generateNonceStr()); //2 发送api.mch.weixin.qq.com/pay/orderquery"); client.setXmlParam(WXPayUtil.generateSignedXml(m, WxPayUtils.WX_PAY_PARTNER_KEY)); client.setHttps(true); client.post(); //3.得到订单数据 String xml = client.getContent(); Map<String, String> resultMap = WXPayUtil.xmlToMap(xml); //4.判断是否支付成功 if(resultMap.get("trade_state").equals("SUCCESS")) { /* 改变数据库中的数据等操作 */ return "支付成功"; } return "支付中"; } @GetMapping("success") public String success(){ return "success"; } @RequestMapping("test") public String test(){ return "pay"; } /** * 生成订单号 * @return */ public static String getOrderNo() { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); String newDate = sdf.format(new Date()); String result = ""; Random random = new Random(); for (int i = 0; i < 3; i++) { result += random.nextInt(10); } return newDate + result; } /** * 元转换成分 * @param amount * @return */ public static String getMoney(String amount) { if(amount==null){ return ""; } // 金额转化为分为单位 // 处理包含, ¥ 或者$的金额 String currency = amount.replaceAll("\\$|\\¥|\\,", ""); int index = currency.indexOf("."); int length = currency.length(); Long amLong = 0l; if(index == -1){ amLong = Long.valueOf(currency+"00"); }else if(length - index >= 3){ amLong = Long.valueOf((currency.substring(0, index+3)).replace(".", "")); }else if(length - index == 2){ amLong = Long.valueOf((currency.substring(0, index+2)).replace(".", "")+0); }else{ amLong = Long.valueOf((currency.substring(0, index+1)).replace(".", "")+"00"); } return amLong.toString(); } }
值得一提的是 这里我们用的是controller而不是restcontroller,因为我们需要展示二维码
4. 在templates文件中新建 订单支付页面(二维码生成的页面)
注意:文件名必须和生成二维码方法中返回的字符串名称一样 我这里叫 pay
先新建html页面,然后再将后缀改成ftl(freemarker模板引擎的后缀名)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="/static/qrcode.js"></script> <script src="img.558idc.com/uploadfile/allimg/210410/1322062514-13.jpg"></script> </head> <center> <div id="qrcode"></div> </center> <script type="text/javascript"> new QRCode(document.getElementById("qrcode"), "${map.code_url}"); // 设置要生成二维码的链接 </script> <script type="text/javascript"> var int=self.setInterval("querystatus()",3000); function querystatus() { $.get("/wxpay/queryorder/${map.no}",function(data,status){ if (data==="支付中"){ console.log("支付中"); } else { clearInterval(int) window.location.href="/wxpay/success" rel="external nofollow" } }) } </script> </body> </html>
再创建支付成功跳转的页面 文件名要与支付成功方法返回的文件名一样
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>支付成功</h1> </body> </html>
引入 qrcode 生成二维码的依赖,放入static文件中
这里我提供下载链接
链接: pan.baidu.com/s/15-E3KpRCenAewh0ZaBLnjQ 提取码: xhs9 复制这段内容后打开百度网盘手机App,操作更方便哦
引入完成后
最后 我们启动项目来测试一下
浏览器输入地址
localhost:8081/wxpay/pay
发现二维码生成成功,并且定时器也没问题
之后我们扫码支付
成功跳转到支付成功页面 ~nice
四. 总结
- 首先就是生成二维码,需要的几个主要的参数,订单号,金额,购买的信息(主体信息),其余的参数除了一些可以不写的都是固定的
- 生成二维码然后展示在页面上,用的qrcode插件,生成
- 然后设置定时器,来实时查询订单是否支付
- 查询订单信息的写法和生成二维码的方式差不多 无非就是请求时少了几个参数,必须得带上订单号
- 微信提供的查询订单接口返回数据中 trade_state 代表支付状态 notpay没有支付,seccess表示已成功
- 定时器检测到订单支付成功就清除定时器,并且执行支付成功之后的操作
实际项目中远没有这么简单,并且所有的数据都要从数据库中获取,在这里我为了方便把价格固定写死的
到此这篇关于Java调用微信支付功能的方法示例代码的文章就介绍到这了,更多相关Java调用微信支付内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!
本文共计2118个文字,预计阅读时间需要9分钟。
Java结合微信支付和百度搜素,描述不够清晰。建议自己编写一个示例,以便今后直接修改使用。由于涉及前端展示和二维码生成,以下是一个简单的示例:
一. 准备工作
1. 创建一个Java项目,添加必要的依赖库(如微信支付SDK、二维码生成库等)。
2.配置微信支付的相关参数(如商户ID、API密钥等)。
二. 示例代码
java
// 微信支付示例代码public class WeChatPayExample { public static void main(String[] args) { // 微信支付参数 String appId=your_app_id; String partnerId=your_partner_id; String partnerKey=your_partner_key; String notifyUrl=your_notify_url;// 构建支付请求参数 Map payParams=new HashMap(); payParams.put(appid, appId); payParams.put(partnerid, partnerId); payParams.put(openid, your_openid); payParams.put(body, 商品描述); payParams.put(out_trade_no, 订单号); payParams.put(total_fee, 1); payParams.put(spbill_create_ip, your_ip); payParams.put(notify_url, notifyUrl); payParams.put(trade_type, JSAPI);
// 生成签名 String sign=generateSign(payParams, partnerKey);
// 构建支付请求JSON字符串 String payJson={\appid\:\ + appId + \,\partnerid\:\ + partnerId + \,\openid\:\ + your_openid + \,\body\:\商品描述\,\out_trade_no\:\ + 订单号 + \,\total_fee\:\1\,\spbill_create_ip\:\ + your_ip + \,\notify_url\:\ + notifyUrl + \,\trade_type\:\JSAPI\,\sign\:\ + sign + \};
// 发送支付请求(此处省略具体实现) // ...
// 二维码生成示例代码 String qrCodeUrl=https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=your_access_token; Map qrCodeParams=new HashMap(); qrCodeParams.put(expire_seconds, 600); qrCodeParams.put(action_name, QR_LIMIT_STR_SCENE); qrCodeParams.put(scene_str, 商品描述);
// 生成签名 String qrCodeSign=generateSign(qrCodeParams, your_secret_key);
// 构建二维码请求JSON字符串 String qrCodeJson={\expire_seconds\:\600\,\action_name\:\QR_LIMIT_STR_SCENE\,\scene_str\:\商品描述\,\sign\:\ + qrCodeSign + \};
// 发送二维码请求(此处省略具体实现) // ... }
// 生成签名 private static String generateSign(Map params, String key) { // 按字典序排序参数 List keys=new ArrayList(params.keySet()); Collections.sort(keys);
// 构建签名原文 StringBuilder signStr=new StringBuilder(); for (String key : keys) { signStr.append(key).append(=).append(params.get(key)).append(&); } signStr.append(key=).append(key);
// 生成签名 return MD5(signStr.toString()).toUpperCase(); }
// MD5加密 private static String MD5(String str) { try { MessageDigest md=MessageDigest.getInstance(MD5); md.update(str.getBytes()); byte[] digest=md.digest(); StringBuilder sb=new StringBuilder(); for (byte b : digest) { sb.append(String.format(%02x, b)); } return sb.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return null; } }}
三. 使用说明
1. 将示例代码中的参数替换为实际参数。
2.根据需要修改代码,实现支付请求和二维码请求的具体实现。
3.将生成的支付链接和二维码展示在前端页面。
通过以上步骤,您可以实现一个简单的Java结合微信支付和百度搜素的示例。
Java 使用微信支付
前言百度搜了一下微信支付,都描述的不太好,于是乎打算自己写一个案例,希望以后拿来直接改造使用。
因为涉及二维码的前端显示,所以有前端的内容
一. 准备工作
所需微信公众号信息配置
- APPID:绑定支付的APPID(必须配置)
- MCHID:商户号(必须配置)
- KEY:商户支付密钥,参考开户邮件设置(必须配置)
- APPSECRET:公众帐号secert(仅JSAPI支付的时候需要配置)
我这个案例用的是尚硅谷一位老师提供的,这里不方便提供出来,需要大家自己找,或者公司提供
二. 构建项目架构
1.新建maven项目
2.导入依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.1.RELEASE</version> </parent> <dependencies> <!--spring boot --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--微信提供的sdk--> <dependency> <groupId>com.github.wxpay</groupId> <artifactId>wxpay-sdk</artifactId> <version>0.0.3</version> </dependency> <!--发送api.mch.weixin.qq.com/pay/unifiedorder"); //设置xml格式的参数 //把xml格式的数据加密 client.setXmlParam(WXPayUtil.generateSignedXml(m, WxPayUtils.WX_PAY_PARTNER_KEY)); client.setHttps(true); //执行post请求发送 client.post(); //4 得到发送请求返回结果 //返回内容,是使用xml格式返回 String xml = client.getContent(); //把xml格式转换map集合,把map集合返回 Map<String,String> resultMap = WXPayUtil.xmlToMap(xml); //最终返回数据 的封装 Map map = new HashMap(); map.put("no", no); map.put("price", price); map.put("result_code", resultMap.get("result_code")); map.put("code_url", resultMap.get("code_url")); model.addAttribute("map",map); return "pay"; } @GetMapping("queryorder/{no}") @ResponseBody public String queryPayStatus(@PathVariable String no) throws Exception{ //1、封装参数 Map m = new HashMap<>(); m.put("appid", WxPayUtils.WX_PAY_APP_ID); m.put("mch_id", WxPayUtils.WX_PAY_PARTNER); m.put("out_trade_no", no); m.put("nonce_str", WXPayUtil.generateNonceStr()); //2 发送api.mch.weixin.qq.com/pay/orderquery"); client.setXmlParam(WXPayUtil.generateSignedXml(m, WxPayUtils.WX_PAY_PARTNER_KEY)); client.setHttps(true); client.post(); //3.得到订单数据 String xml = client.getContent(); Map<String, String> resultMap = WXPayUtil.xmlToMap(xml); //4.判断是否支付成功 if(resultMap.get("trade_state").equals("SUCCESS")) { /* 改变数据库中的数据等操作 */ return "支付成功"; } return "支付中"; } @GetMapping("success") public String success(){ return "success"; } @RequestMapping("test") public String test(){ return "pay"; } /** * 生成订单号 * @return */ public static String getOrderNo() { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); String newDate = sdf.format(new Date()); String result = ""; Random random = new Random(); for (int i = 0; i < 3; i++) { result += random.nextInt(10); } return newDate + result; } /** * 元转换成分 * @param amount * @return */ public static String getMoney(String amount) { if(amount==null){ return ""; } // 金额转化为分为单位 // 处理包含, ¥ 或者$的金额 String currency = amount.replaceAll("\\$|\\¥|\\,", ""); int index = currency.indexOf("."); int length = currency.length(); Long amLong = 0l; if(index == -1){ amLong = Long.valueOf(currency+"00"); }else if(length - index >= 3){ amLong = Long.valueOf((currency.substring(0, index+3)).replace(".", "")); }else if(length - index == 2){ amLong = Long.valueOf((currency.substring(0, index+2)).replace(".", "")+0); }else{ amLong = Long.valueOf((currency.substring(0, index+1)).replace(".", "")+"00"); } return amLong.toString(); } }
值得一提的是 这里我们用的是controller而不是restcontroller,因为我们需要展示二维码
4. 在templates文件中新建 订单支付页面(二维码生成的页面)
注意:文件名必须和生成二维码方法中返回的字符串名称一样 我这里叫 pay
先新建html页面,然后再将后缀改成ftl(freemarker模板引擎的后缀名)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="/static/qrcode.js"></script> <script src="img.558idc.com/uploadfile/allimg/210410/1322062514-13.jpg"></script> </head> <center> <div id="qrcode"></div> </center> <script type="text/javascript"> new QRCode(document.getElementById("qrcode"), "${map.code_url}"); // 设置要生成二维码的链接 </script> <script type="text/javascript"> var int=self.setInterval("querystatus()",3000); function querystatus() { $.get("/wxpay/queryorder/${map.no}",function(data,status){ if (data==="支付中"){ console.log("支付中"); } else { clearInterval(int) window.location.href="/wxpay/success" rel="external nofollow" } }) } </script> </body> </html>
再创建支付成功跳转的页面 文件名要与支付成功方法返回的文件名一样
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>支付成功</h1> </body> </html>
引入 qrcode 生成二维码的依赖,放入static文件中
这里我提供下载链接
链接: pan.baidu.com/s/15-E3KpRCenAewh0ZaBLnjQ 提取码: xhs9 复制这段内容后打开百度网盘手机App,操作更方便哦
引入完成后
最后 我们启动项目来测试一下
浏览器输入地址
localhost:8081/wxpay/pay
发现二维码生成成功,并且定时器也没问题
之后我们扫码支付
成功跳转到支付成功页面 ~nice
四. 总结
- 首先就是生成二维码,需要的几个主要的参数,订单号,金额,购买的信息(主体信息),其余的参数除了一些可以不写的都是固定的
- 生成二维码然后展示在页面上,用的qrcode插件,生成
- 然后设置定时器,来实时查询订单是否支付
- 查询订单信息的写法和生成二维码的方式差不多 无非就是请求时少了几个参数,必须得带上订单号
- 微信提供的查询订单接口返回数据中 trade_state 代表支付状态 notpay没有支付,seccess表示已成功
- 定时器检测到订单支付成功就清除定时器,并且执行支付成功之后的操作
实际项目中远没有这么简单,并且所有的数据都要从数据库中获取,在这里我为了方便把价格固定写死的
到此这篇关于Java调用微信支付功能的方法示例代码的文章就介绍到这了,更多相关Java调用微信支付内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!

