一. 调用微信统一下单接口
1.支付流程
商户后台系统先调用微信支付的统一下单接口,微信后台系统返回链接参数code_url,
商户后台系统将code_url值生成二维码图片
2.调用统一下单接口
https://api.mch.weixin.qq.com/pay/unifiedorder
3.前端安装二维码插件
a.下载依赖 npm install vue-qriously --save-dev
b.找到plugins—nuxt-swiper-plugin.js
import VueQriously from ‘vue-qriously’
Vue.use(VueQriously)
4.查询订单支付状态
a.支付成功之后的流程
b.修改订单表里面的状态
c.往支付记录表里面添加一条记录
5.前端之后成功之后页面跳转
a.通过前端的定时任务(*)
b.通过通知地址回调

二. java代码实现二维码扫码支付
1.微信统一下订单

 //3.微信统一下订单@GetMapping("createPayQrCode/{orderNo}")//通过订单id创建支付订单public RetVal createPayQrCode(@PathVariable String orderNo) throws Exception {Map<String, Object> retMap = orderService.createPayQrCode(orderNo);return RetVal.success().data(retMap);}

2.调用微信下单API,需用到工具类HttpClient

public class HttpClient {private String url;private Map<String, String> param;private int statusCode;private String content;private String xmlParam;private boolean isHttps;public boolean isHttps() {return isHttps;}public void setHttps(boolean isHttps) {this.isHttps = isHttps;}public String getXmlParam() {return xmlParam;}public void setXmlParam(String xmlParam) {this.xmlParam = xmlParam;}public HttpClient(String url, Map<String, String> param) {this.url = url;this.param = param;}public HttpClient(String url) {this.url = url;}public void setParameter(Map<String, String> map) {param = map;}public void addParameter(String key, String value) {if (param == null)param = new HashMap<String, String>();param.put(key, value);}public void post() throws ClientProtocolException, IOException {HttpPost http = new HttpPost(url);setEntity(http);execute(http);}public void put() throws ClientProtocolException, IOException {HttpPut http = new HttpPut(url);setEntity(http);execute(http);}public void get() throws ClientProtocolException, IOException {if (param != null) {StringBuilder url = new StringBuilder(this.url);boolean isFirst = true;for (String key : param.keySet()) {if (isFirst)url.append("?");elseurl.append("&");url.append(key).append("=").append(param.get(key));}this.url = url.toString();}HttpGet http = new HttpGet(url);execute(http);}/*** set http post,put param*/private void setEntity(HttpEntityEnclosingRequestBase http) {if (param != null) {List<NameValuePair> nvps = new LinkedList<NameValuePair>();for (String key : param.keySet())nvps.add(new BasicNameValuePair(key, param.get(key))); // 参数http.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8)); // 设置参数}if (xmlParam != null) {http.setEntity(new StringEntity(xmlParam, Consts.UTF_8));}}private void execute(HttpUriRequest http) throws ClientProtocolException,IOException {CloseableHttpClient httpClient = null;try {if (isHttps) {SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {// 信任所有public boolean isTrusted(X509Certificate[] chain,String authType)throws CertificateException {return true;}}).build();SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();} else {httpClient = HttpClients.createDefault();}CloseableHttpResponse response = httpClient.execute(http);try {if (response != null) {if (response.getStatusLine() != null)statusCode = response.getStatusLine().getStatusCode();HttpEntity entity = response.getEntity();// 响应内容content = EntityUtils.toString(entity, Consts.UTF_8);}} finally {response.close();}} catch (Exception e) {e.printStackTrace();} finally {httpClient.close();}}public int getStatusCode() {return statusCode;}public String getContent() throws ParseException, IOException {return content;}
}

3.编写service层业务逻辑
注入配置文件中需要传递的信息

@Value("${wx.pay.app_id}")private String WX_PAY_APP_ID;@Value("${wx.pay.mch_id}")private String WX_PAY_MCH_ID;@Value("${wx.pay.spbill_create_ip}")private String WX_PAY_SPBILL_IP;@Value("${wx.pay.notify_url}")private String WX_PAY_NOTIFY_URL;@Value("${wx.pay.xml_key}")private String WX_PAY_XML_KEY;

4.对照微信支付官网,找到必须传递的数据,不是必须的数据看具体业务逻辑添加

 @Overridepublic Map<String, Object> createPayQrCode(String orderNo) throws Exception {QueryWrapper<EduOrder> wrapper = new QueryWrapper<>();wrapper.eq("order_no", orderNo);EduOrder order = baseMapper.selectOne(wrapper);//把传递的参数封装成一个map结构Map<String, String> requestParams = new HashMap<>();//公众账号ID   appidrequestParams.put("appid",WX_PAY_APP_ID);//商户号   mch_idrequestParams.put("mch_id",WX_PAY_MCH_ID);//随机字符串   nonce_strrequestParams.put("nonce_str", WXPayUtil.generateNonceStr());//商品描述  bodyrequestParams.put("body",order.getCourseTitle());//商户订单号  out_trade_norequestParams.put("out_trade_no",orderNo);//标价金额  total_fee  商品的金额0.01分-->0.01元BigDecimal totalFee = order.getTotalFee();String totalFeeStr=totalFee.multiply(new BigDecimal(100)).intValue()+"";requestParams.put("total_fee",totalFeeStr);//终端IP  spbill_create_iprequestParams.put("spbill_create_ip",WX_PAY_SPBILL_IP);//通知地址 notify_urlrequestParams.put("notify_url",WX_PAY_NOTIFY_URL);//交易类型    trade_type  是requestParams.put("trade_type","NATIVE");//把map接口的参数转换成xml并且签名String paramsXml = WXPayUtil.generateSignedXml(requestParams, WX_PAY_XML_KEY);//调用微信下单APIHttpClient httpClient = new HttpClient("https://api.mch.weixin.qq.com/pay/unifiedorder");httpClient.setXmlParam(paramsXml);httpClient.setHttps(true);httpClient.post();//因为数据太多,为了保证数据安全性,所有有选择地返回数据//加返回的数据封装到map中String content = httpClient.getContent();Map<String, String> txRetVal = WXPayUtil.xmlToMap(content);Map<String, Object> retVal = new HashMap<>();String qrCodeUrl = txRetVal.get("code_url");retVal.put("qrCodeUrl",qrCodeUrl);retVal.put("orderNo",orderNo);retVal.put("totalFee",order.getTotalFee());retVal.put("courseId",order.getCourseId());return retVal;}

5.扫码支付完成需跳转到支付结果页面,也就是查询支付订单,显示支付成功,并根据业务逻辑显示需要显示的信息,最后跟新订单状态。。。。代码比较简单,我就直接贴在下面

 //4.查询支付订单@GetMapping("queryPayState/{orderNo}")public RetVal queryPayState(@PathVariable String orderNo) throws Exception {Map<String, String> txRetMap = orderService.queryPayState(orderNo);//更新订单状态if(txRetMap.get("trade_state").equals("SUCCESS")){orderService.updateOrderState(txRetMap);return RetVal.success().message("支付成功");}else{return RetVal.error().message("支付失败");}}

service层

  @Overridepublic Map<String, String> queryPayState(String orderNo) throws Exception{//把传递的参数封装成一个map结构Map<String, String> requestParams = new HashMap<>();//公众账号ID  appidrequestParams.put("appid",WX_PAY_APP_ID);//商户号   mch_idrequestParams.put("mch_id",WX_PAY_MCH_ID);//随机字符串   nonce_strrequestParams.put("nonce_str", WXPayUtil.generateNonceStr());//商户订单号 out_trade_norequestParams.put("out_trade_no",orderNo);//把map接口的参数转换成xml并且签名String paramsXml = WXPayUtil.generateSignedXml(requestParams, WX_PAY_XML_KEY);//调用微信下单APIHttpClient httpClient = new HttpClient("https://api.mch.weixin.qq.com/pay/orderquery");httpClient.setXmlParam(paramsXml);httpClient.setHttps(true);httpClient.post();String content = httpClient.getContent();Map<String, String> txRetVal = WXPayUtil.xmlToMap(content);return txRetVal;}@Overridepublic void updateOrderState(Map<String, String> txRetMap) {//b.修改订单表里面的状态QueryWrapper<EduOrder> wrapper = new QueryWrapper<>();String orderNo = txRetMap.get("out_trade_no");wrapper.eq("order_no", orderNo);EduOrder order = baseMapper.selectOne(wrapper);order.setStatus(1);baseMapper.updateById(order);//c.往支付记录表里面添加一条记录QueryWrapper<EduPayLog> logWrapper = new QueryWrapper<>();logWrapper.eq("order_no", orderNo);EduPayLog existLog = payLogService.getOne(logWrapper);if(existLog==null){EduPayLog payLog = new EduPayLog();payLog.setOrderNo(orderNo);payLog.setPayTime(new Date());payLog.setTotalFee(order.getTotalFee());payLog.setTransactionId(txRetMap.get("transaction_id"));payLog.setTradeState(txRetMap.get("trade_state"));payLogService.save(payLog);}}

微信支付系列(三)之二维码扫码支付相关推荐

  1. 微信支付宝合并为一个二维码支付的实现

    背景说明 我们是一个位于三线城市的购物中心,虽然已经开业多年,但是受益于良好的招商和日常运营,客流量在同城同类型项目中一直比较稳定.在节假日出场车流高峰期的时候,由于人工收费的效率问题,会导致车辆积压 ...

  2. 微信,支付宝,收款二维码实时生成订单监控,免签支,付支付系统,个人收款,收款二维码...

    微信,支付宝,收款二维码实时生成订单监控,免签支,付支付系统,个人收款,收款二维码 微信和支付宝个人支付二维码生成与监控!有PHP接口回调,个人收款好助手! 实现收款即时到个人微信或支付宝账户!方便安 ...

  3. 微信支付接口调用之二维码失效时间的设置

    今天解决了测试提交上来的一个bug,说是公司网站调用的二维码接口没有做超时失效处理,这种情况容易导致用户账号登出后,该二维码还是有效的,当用户扫描支付时还是能够支付成功,但是微信支付成功后调用我们配置 ...

  4. java实现微信支付宝等多个支付平台合一的二维码支付(SSM框架)

    点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐] ♪ 点击上方绿标 收听java实现微信支付宝等多个支付平台合一的二维码支付(SSM框架) 整体思路: 实现微信支付宝等支付平台合多为一的二 ...

  5. 深入支付宝支付扫描支付-跳转支付宝二维码页面支付与自定义生成二维码支付-1参数配置篇

    这里较详细总结一下支付宝扫码支付,从三个方面总结 ①参数配置 ②跳转固定的支付宝页面进行扫码支付 ③自定义二维码扫码支付 参数配置-开放平台相关配置(沙箱环境) 刚开始支付宝的配置参数还是有点让人懵逼 ...

  6. 微信小程序条码、二维码生成模块

    代码地址如下: http://www.demodashi.com/demo/13994.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.c ...

  7. 微信公众号生成临时二维码

    微信公众号生成临时二维码 微信公众平台生成带参数的二维码官方文档 分为三个部分: 获取access_token.通过ticket换取二维码.生成带参数的二维码 特别注意:需要有生成二维码的权限. 整个 ...

  8. 深入理解微信二维码扫码登录的原理

    文章目录 1.二维码应用场景及安全问题 2.二维码登录的本质 3.二维码验证机制的原理解析 4.深入理解二维码在登录的交互过程 5.总结感悟 1.二维码应用场景及安全问题 二维码使用广泛,生活处处都有 ...

  9. 微信QQ支付宝三合一收款二维码实现原理

    大家可以先看看我网站的效果: 收款吧 - 三合一收款码在线生成 收款码三合一大致原理如下: 第一步.解析用户上传的微信支付.QQ钱包.支付宝收款二维码,获取收款链接地址. 第二步.用自己的网站程序生成 ...

  10. html如何将地址、路径、支付code_url转成二维码

    扫描二维码跳转到指定页面.使用微信扫描二维码出现微信支付页面 程序返回的code_url并没有返回扫描支付二维码,就需要使用qrcode.js将code_url转成二维码 就可以直接微信扫码支付 直接 ...

最新文章

  1. dubbo扫描第三方包_今天来浅谈一下dubbo
  2. ui和android有联系,Android单位换算与UI适配
  3. 连接API:如何将iOS和JSON框架集成
  4. 揭秘双11丝滑般剁手之路背后的网络监控技术
  5. 揭秘MySQL生态重要功能,X-Engine引擎核心能力——OnlineDDL
  6. 长隆大马戏机器人_惊艳亮相广州长隆,智伴儿童机器人1X成行业焦点
  7. 如何让组织的KPI成为敏捷转型的推手而不是杀手 | IDCF
  8. flutter 自定义键盘_掘金 AMA:听闲鱼客户端架构师邬吉风聊 Flutter 和移动端开发那些事...
  9. 修改tomcat版本号解决eclipse中tomcat版本不对应
  10. P5339 [TJOI2019]唱、跳、rap和篮球
  11. 草图大师怎么取消组件关联_sketchup取消隐藏(草图大师里取消全部隐藏快捷键)...
  12. X站全称是什么_考不上高中上什么专业
  13. linux下下载fnl数据,「技术讲堂第二期」|不用到处找,FNL数据直接用!
  14. RuntimeError: stack expects each tensor to be equal size, but got xxx at entry 0 at entry 1
  15. 京东商城空调标价0元引发抢购
  16. HALCON数组的删除 三
  17. Mycat生产实践---Mycat实施指南
  18. IDEA运行Java Applet程序
  19. WJ13-涂鸦版参数
  20. 三维GIS工程师进阶训练营

热门文章

  1. sumif单列求和_EXCEL条件求和函数SUMIF的几种常见用法
  2. 办公环境大改造 澳洲健康食品激活生活每一天 VTN品牌俱乐部把关你的品质生活
  3. H3C WA4320H-ACN 无线AP硬改支持集客256M内存启动
  4. 重装系统之制作U盘启动盘 - 一盘通装
  5. c语言case用多重语句,switch多重选择
  6. GokeAudio是一款简约小巧的开源安卓SIP软电话客户端
  7. java 以2为底的对数_Java对数函数及Java对数运算
  8. “目标-用户-指标”——企业开源运营之道|瞰道@谭中意
  9. VMware中安装Win10超详细步骤
  10. java转换docx为doc文件_JAVA - 将doc文档转为docx文档