二维码扫码支付实现方案(仅供自己参考)
目录
二维码介绍
二维码生成插件qrious
申请微信二维码支付
HttpClient工具类的简单使用
生成二维码服务
spring mvc控制层
页面控制层
前言
此篇仅供自己参考,你们看不懂的,不要浪费时间
此篇会讲解,微信二维码的生成,以及检测支付状态,支付日志
二维码介绍
二维码生成插件qrious
访问二维码页面即有二维码
<html>
<head>
<title>二维码入门小demo</title>
</head>
<body>
<img id="qrious">
<script src="qrious.min.js"></script>
<script>var qr = new QRious({element:document.getElementById('qrious'),size:250, level:'H', value:'http://www.baidu.com'});
</script>
</body>
</html>
申请微信二维码支付
官方有文档 https://pay.weixin.qq.com/wiki/doc/api/index.html
把他们的sdk安装到本地maven仓库
HttpClient工具类的简单使用
HttpClient通俗的讲就是模拟了浏览器的行为,如果我们需要在后端向某一地址提交数据获取结果,就可以使用HttpClient
生成二维码服务
@Service
public class WeixinPayServiceImpl implements WeixinPayService {@Value("${appid}")private String appid;@Value("${partner}")private String partner;@Value("${partnerkey}")private String partnerkey;/*** 生成二维码* @return*/public Map createNative(String out_trade_no,String total_fee){//1.创建参数Map<String,String> param=new HashMap();//创建参数param.put("appid", appid);//公众号param.put("mch_id", partner);//商户号param.put("nonce_str", WXPayUtil.generateNonceStr());//随机字符串 param.put("body", "品优购");//商品描述param.put("out_trade_no", out_trade_no);//商户订单号param.put("total_fee",total_fee);//总金额(分)param.put("spbill_create_ip", "127.0.0.1");//IPparam.put("notify_url", "http://test.itcast.cn");//回调地址(随便写)param.put("trade_type", "NATIVE");//交易类型try {//2.生成要发送的xml String xmlParam = WXPayUtil.generateSignedXml(param, partnerkey);System.out.println(xmlParam); HttpClient client=new HttpClient("https://api.mch.weixin.qq.com/pay/unifiedorder");client.setHttps(true);client.setXmlParam(xmlParam);client.post(); //3.获得结果 String result = client.getContent();System.out.println(result);Map<String, String> resultMap = WXPayUtil.xmlToMap(result); Map<String, String> map=new HashMap<>();map.put("code_url", resultMap.get("code_url"));//支付地址map.put("total_fee", total_fee);//总金额map.put("out_trade_no",out_trade_no);//订单号return map;} catch (Exception e) {e.printStackTrace();return new HashMap<>();} }
}
spring mvc控制层
@RestController
@RequestMapping("/pay")
public class PayController {@Referenceprivate WeixinPayService weixinPayService;/*** 生成二维码* @return*/@RequestMapping("/createNative")public Map createNative(){IdWorker idworker=new IdWorker(); return weixinPayService.createNative(idworker.nextId()+"","1"); }
}
页面控制层
app.controller('payController' ,function($scope ,payService){ //本地生成二维码$scope.createNative=function(){payService.createNative().success(function(response){$scope.money= (response.total_fee/100).toFixed(2) ; //金额$scope.out_trade_no= response.out_trade_no;//订单号//二维码var qr = new QRious({element:document.getElementById('qrious'),size:250,level:'H',value:response.code_url}); }); }
});
监控支付状态
支付成功跳转到支持成功页面,支付失败跳到失败页面
还需要在生成二维码生成的页面控制层加入页面查询支付状态函数
public Map queryPayStatus(String out_trade_no) {Map param=new HashMap();param.put("appid", appid);//公众账号IDparam.put("mch_id", partner);//商户号param.put("out_trade_no", out_trade_no);//订单号param.put("nonce_str", WXPayUtil.generateNonceStr());//随机字符串String url="https://api.mch.weixin.qq.com/pay/orderquery"; try {String xmlParam = WXPayUtil.generateSignedXml(param, partnerkey); HttpClient client=new HttpClient(url);client.setHttps(true);client.setXmlParam(xmlParam);client.post();String result = client.getContent(); Map<String, String> map = WXPayUtil.xmlToMap(result);System.out.println(map);return map; } catch (Exception e) {e.printStackTrace();return null;} }
spring mvc控制层
@RequestMapping("/queryPayStatus")public Result queryPayStatus(String out_trade_no){Result result=null; while(true){//调用查询接口Map<String,String> map = weixinPayService.queryPayStatus(out_trade_no);if(map==null){//出错 result=new Result(false, "支付出错");break;} if(map.get("trade_state").equals("SUCCESS")){//如果成功 result=new Result(true, "支付成功");break;} try {Thread.sleep(3000);//间隔三秒} catch (InterruptedException e) {e.printStackTrace();} }return result;}
查询时间限制
修改查询状态代码
@RequestMapping("/queryPayStatus")public Result queryPayStatus(String out_trade_no){Result result=null; int x=0; while(true){//调用查询接口....... try {Thread.sleep(3000);//间隔三秒} catch (InterruptedException e) {e.printStackTrace();} //为了不让循环无休止地运行,我们定义一个循环变量,如果这个变量超过了这个值则退出循环,设置时间为5分钟x++;if(x>=100){result=new Result(false, "二维码超时");break;}}return result;}
修改页面查询状态的控制层
支付成功页面显示金额
只需要利用angularJS的页面传参
支付日志问题
参考代码
public void add(TbOrder order) {List<Cart> cartList = (List<Cart>) redisTemplate.boundHashOps("cartList").get( order.getUserId() );List<String> orderIdList=new ArrayList();//订单ID列表double total_money=0;//总金额 (元)for(Cart cart:cartList){long orderId = idWorker.nextId();...... orderIdList.add(orderId+"");//添加到订单列表 total_money+=money;//累加到总金额 }if("1".equals(order.getPaymentType())){//如果是微信支付 TbPayLog payLog=new TbPayLog();String outTradeNo= idWorker.nextId()+"";//支付订单号payLog.setOutTradeNo(outTradeNo);//支付订单号payLog.setCreateTime(new Date());//创建时间//订单号列表,逗号分隔String ids=orderIdList.toString().replace("[", "").replace("]", "").replace(" ", "");payLog.setOrderList(ids);//订单号列表,逗号分隔payLog.setPayType("1");//支付类型payLog.setTotalFee( (long)(total_money*100 ) );//总金额(分)payLog.setTradeState("0");//支付状态payLog.setUserId(order.getUserId());//用户ID payLogMapper.insert(payLog);//插入到支付日志表 redisTemplate.boundHashOps("payLog").put(order.getUserId(), payLog);//放入缓存 } redisTemplate.boundHashOps("cartList").delete(order.getUserId()); }
public TbPayLog searchPayLogFromRedis(String userId) {return (TbPayLog) redisTemplate.boundHashOps("payLog").get(userId); }
@RequestMapping("/createNative")public Map createNative(){//获取当前用户 String userId=SecurityContextHolder.getContext().getAuthentication().getName();//到redis查询支付日志TbPayLog payLog = orderService.searchPayLogFromRedis(userId);//判断支付日志存在if(payLog!=null){return weixinPayService.createNative(payLog.getOutTradeNo(),payLog.getTotalFee()+"");}else{return new HashMap();} }
public void updateOrderStatus(String out_trade_no, String transaction_id) {//1.修改支付日志状态TbPayLog payLog = payLogMapper.selectByPrimaryKey(out_trade_no);payLog.setPayTime(new Date());payLog.setTradeState("1");//已支付payLog.setTransactionId(transaction_id);//交易号payLogMapper.updateByPrimaryKey(payLog); //2.修改订单状态String orderList = payLog.getOrderList();//获取订单号列表String[] orderIds = orderList.split(",");//获取订单号数组for(String orderId:orderIds){TbOrder order = orderMapper.selectByPrimaryKey( Long.parseLong(orderId) );if(order!=null){order.setStatus("2");//已付款orderMapper.updateByPrimaryKey(order);} }//清除redis缓存数据 redisTemplate.boundHashOps("payLog").delete(payLog.getUserId());}
在微信支付接口有成功返回状态时,调用修改状态的方法
二维码扫码支付实现方案(仅供自己参考)相关推荐
- VB6 简单实现 支付宝二维码扫马支付
VB6 简单实现 支付宝二维码扫马支付 完整源码如下 Private Declare Function 初始化 Lib "alipay.dll" (ByVal 服务器 As Str ...
- 移动二维码支付 推进二维码扫码智能POS
现如今:银币.再到纸币,演变到"钱"变得越来越轻薄.在现在这个移动支付市场中,互联网技术的支撑下,刷手机乘公交.刷支付宝买菜购物.缴水电费--日常生活中使用"现金&quo ...
- spring boot高性能实现二维码扫码登录(上)——单服务器版
前言 目前网页的主流登录方式是通过手机扫码二维码登录.我看了网上很多关于扫码登录博客后,发现基本思路大致是:打开网页,生成uuid,然后长连接请求后端并等待登录认证相应结果,而后端每个几百毫秒会循环查 ...
- TCPIP远程网络电子健康码扫码设备|二维码扫码门禁机HX-QR86L-IP在校园复学防疫领域的应用
TCPIP远程网络电子健康码扫码设备|二维码扫码门禁机HX-QR86L-IP是一款铝合金材质.带液晶显示屏,一机两用,即可做门禁读头使用,也可以做电子健康码数据采集使用.可支持静态.手机动态二维码识别 ...
- 二维码扫码登录是什么原理?
在日常生活中,二维码出现在很多场景,比如超市支付.系统登录.应用下载等等.了解二维码的原理,可以为技术人员在技术选型时提供新的思路.对于非技术人员呢,除了解惑,还可以引导他更好地辨别生活中遇到的各种二 ...
- 细说二维码扫码登录的原理
前言 在日常生活中,二维码出现在很多场景,比如超市支付.系统登录.应用下载等等.了解二维码的原理,可以为技术人员在技术选型时提供新的思路.对于非技术人员呢,除了解惑,还可以引导他更好地辨别生活中遇到的 ...
- 聊聊二维码扫码登录的原理
点击上方 "大数据肌肉猿"关注, 星标一起成长 后台回复[加群],进入高质量学习交流群 2021年大数据肌肉猿公众号奖励制度 原文:https://juejin.cn/post/6 ...
- 面试官:说说二维码扫码登录是什么原理吗?
你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 juejin.cn/post/6940976355097985032 推荐:ht ...
- 二维码扫码登录的项目实战(建议收藏)
点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐] 点击领取全栈资料:全栈资料 前几天看了一个二维码的视频,写的不错,这里总结下. 在日常生活中,二维码出现在很多场景,比如超市支付.系统登录 ...
- 抖音二面:“聊聊二维码扫码登录的原理”
文章来源:https://juejin.cn/post/6940976355097985032 目录 二维码登录的本质 认识二维码 系统认证机制 扫描二维码登录的一般步骤 总结 前言 在日常生活中,二 ...
最新文章
- Bert时代的创新:Bert应用模式比较及其它 | 技术头条
- 【CF应用开发大赛】微博社交简历
- git 提交遇到error:fail to push some refer to 远程地址(url)
- 过完年进入BAT 需要做哪些准备
- jquery中prop()和attr()的使用
- MATLAB模拟声压分布,基于Matlab仿真软件构建圆形压电晶体三维模型
- LintCode 4.丑数
- Bailian2739 计算对数【对数】
- bzoj 1667: [Usaco2006 Oct]Cows on Skates滑旱冰的奶牛(BFS)
- Android表格布局之设置边框
- Rust : 性能测试criterion库
- 地图 显示 动态轨迹_野外探路必备神器——奥维互动地图浏览器
- 我和我的项目之整合腾讯云短信SDK
- Arcgis土地利用转移矩阵制作
- 还记得最初的九九乘法表吗?
- [算法]算法学习05
- 礼金记账本安卓_礼金记账本
- 【数据库】云数据库rds是什么意思?有什么优势?
- 【深度学习】实战之MNIST
- Java JCEF集成Chromium
热门文章
- 一款优秀的中文识别库——ocr
- 配置gitLab的邮件服务,并开启邮箱的验证通知功能
- 全民居家都带不动的AI健身,到底是不是伪命题?
- 【Bug】Microsoft Edge拒绝访问
- cvc降噪和主动降噪_蓝牙耳机降噪功能CVC好还是DSP?
- linux虚拟机中如何复制粘贴内容到主机
- AT91SAM9260搭建LINUX操作系统
- 如何实现向APP推送消息
- 如何在互联网上寻找免费电子书?(其二)
- 40163 php,微信支付授权获取 openId {quot;errcodequot;:40163,quot;errmsgquot;:quot;code been used, hints:...