目录

二维码介绍

二维码生成插件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());}

在微信支付接口有成功返回状态时,调用修改状态的方法

二维码扫码支付实现方案(仅供自己参考)相关推荐

  1. VB6 简单实现 支付宝二维码扫马支付

    VB6 简单实现 支付宝二维码扫马支付 完整源码如下 Private Declare Function 初始化 Lib "alipay.dll" (ByVal 服务器 As Str ...

  2. 移动二维码支付 推进二维码扫码智能POS

    现如今:银币.再到纸币,演变到"钱"变得越来越轻薄.在现在这个移动支付市场中,互联网技术的支撑下,刷手机乘公交.刷支付宝买菜购物.缴水电费--日常生活中使用"现金&quo ...

  3. spring boot高性能实现二维码扫码登录(上)——单服务器版

    前言 目前网页的主流登录方式是通过手机扫码二维码登录.我看了网上很多关于扫码登录博客后,发现基本思路大致是:打开网页,生成uuid,然后长连接请求后端并等待登录认证相应结果,而后端每个几百毫秒会循环查 ...

  4. TCPIP远程网络电子健康码扫码设备|二维码扫码门禁机HX-QR86L-IP在校园复学防疫领域的应用

    TCPIP远程网络电子健康码扫码设备|二维码扫码门禁机HX-QR86L-IP是一款铝合金材质.带液晶显示屏,一机两用,即可做门禁读头使用,也可以做电子健康码数据采集使用.可支持静态.手机动态二维码识别 ...

  5. 二维码扫码登录是什么原理?

    在日常生活中,二维码出现在很多场景,比如超市支付.系统登录.应用下载等等.了解二维码的原理,可以为技术人员在技术选型时提供新的思路.对于非技术人员呢,除了解惑,还可以引导他更好地辨别生活中遇到的各种二 ...

  6. 细说二维码扫码登录的原理

    前言 在日常生活中,二维码出现在很多场景,比如超市支付.系统登录.应用下载等等.了解二维码的原理,可以为技术人员在技术选型时提供新的思路.对于非技术人员呢,除了解惑,还可以引导他更好地辨别生活中遇到的 ...

  7. 聊聊二维码扫码登录的原理

    点击上方 "大数据肌肉猿"关注, 星标一起成长 后台回复[加群],进入高质量学习交流群 2021年大数据肌肉猿公众号奖励制度 原文:https://juejin.cn/post/6 ...

  8. 面试官:说说二维码扫码登录是什么原理吗?

    你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 juejin.cn/post/6940976355097985032 推荐:ht ...

  9. 二维码扫码登录的项目实战(建议收藏)

    点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐] 点击领取全栈资料:全栈资料 前几天看了一个二维码的视频,写的不错,这里总结下. 在日常生活中,二维码出现在很多场景,比如超市支付.系统登录 ...

  10. 抖音二面:“聊聊二维码扫码登录的原理”

    文章来源:https://juejin.cn/post/6940976355097985032 目录 二维码登录的本质 认识二维码 系统认证机制 扫描二维码登录的一般步骤 总结 前言 在日常生活中,二 ...

最新文章

  1. Bert时代的创新:Bert应用模式比较及其它 | 技术头条
  2. 【CF应用开发大赛】微博社交简历
  3. git 提交遇到error:fail to push some refer to 远程地址(url)
  4. 过完年进入BAT 需要做哪些准备
  5. jquery中prop()和attr()的使用
  6. MATLAB模拟声压分布,基于Matlab仿真软件构建圆形压电晶体三维模型
  7. LintCode 4.丑数
  8. Bailian2739 计算对数【对数】
  9. bzoj 1667: [Usaco2006 Oct]Cows on Skates滑旱冰的奶牛(BFS)
  10. Android表格布局之设置边框
  11. Rust : 性能测试criterion库
  12. 地图 显示 动态轨迹_野外探路必备神器——奥维互动地图浏览器
  13. 我和我的项目之整合腾讯云短信SDK
  14. Arcgis土地利用转移矩阵制作
  15. 还记得最初的九九乘法表吗?
  16. [算法]算法学习05
  17. 礼金记账本安卓_礼金记账本
  18. 【数据库】云数据库rds是什么意思?有什么优势?
  19. 【深度学习】实战之MNIST
  20. Java JCEF集成Chromium

热门文章

  1. 一款优秀的中文识别库——ocr
  2. 配置gitLab的邮件服务,并开启邮箱的验证通知功能
  3. 全民居家都带不动的AI健身,到底是不是伪命题?
  4. 【Bug】Microsoft Edge拒绝访问
  5. cvc降噪和主动降噪_蓝牙耳机降噪功能CVC好还是DSP?
  6. linux虚拟机中如何复制粘贴内容到主机
  7. AT91SAM9260搭建LINUX操作系统
  8. 如何实现向APP推送消息
  9. 如何在互联网上寻找免费电子书?(其二)
  10. 40163 php,微信支付授权获取 openId {quot;errcodequot;:40163,quot;errmsgquot;:quot;code been used, hints:...