应用场景:
商户根据商品信息,生成商品二维码,用户通过微信扫一扫功能扫描该二维码,完成支付。
支付模式:
现在微信扫码支付支持两种模式。
模式一需要商户必须先在公众平台后台设置支付回调URL。URL实现的功能:接收用户扫码后微信支付系统回调的productid和openid。
模式二与模式一相比,流程更为简单,不依赖设置的回调支付URL。商户后台系统先调用微信支付的统一下单接口,微信后台系统返回链接参数code_url,商户后台系统将code_url值生成二维码图片,用户使用微信客户端扫码后发起支付。注意:code_url有效期为2小时,过期后扫码不能再发起支付。
我使用的模式二,也就是微信的统一下单接口。该模式的业务流程时序图如下:

业务流程说明:
(1)商户后台系统根据用户选购的商品生成订单。
(2)用户确认支付后调用微信支付【统一下单API】生成预支付交易;
(3)微信支付系统收到请求后生成预支付交易单,并返回交易会话的二维码链接code_url。
(4)商户后台系统根据返回的code_url生成二维码。
(5)用户打开微信“扫一扫”扫描二维码,微信客户端将扫码内容发送到微信支付系统。
(6)微信支付系统收到客户端请求,验证链接有效性后发起用户支付,要求用户授权。
(7)用户在微信客户端输入密码,确认支付后,微信客户端提交授权。
(8)微信支付系统根据用户授权完成支付交易。
(9)微信支付系统完成支付交易后给微信客户端返回交易结果,并将交易结果通过短信、微信消息提示用户。微信客户端展示支付交易结果页面。
(10)微信支付系统通过发送异步消息通知商户后台系统支付结果。商户后台系统需回复接收情况,通知微信后台系统不再发送该单的支付通知。
(11)未收到支付通知的情况,商户后台系统调用【查询订单API】。
(12)商户确认订单已支付后给用户发货。

整个支付流程精简下来主要就是2点:
①调用接口获取支付二维码并显示出来
②微信回调接口,通知支付结果
针对这2点我写了两个方法,一个是获取二维码,一个是提供给微信的支付结果回调接口。
开发过程中需要用到微信提供的jar包,maven地址如下:

        <dependency><groupId>com.github.wxpay</groupId><artifactId>wxpay-sdk</artifactId><version>0.0.3</version></dependency>
/*** 该类为配置类,主要是关于公众号和商户的一些配置信息抽离出来* @author ** 2017年11月17日*/
public class MyConfig implements WXPayConfig{//公众账号IDpublic String getAppID() {return "wx11bd61834b0d57ef";}public int getHttpConnectTimeoutMs() {return 8000;}public int getHttpReadTimeoutMs() {return 10000;}//商户秘钥public String getKey() {return "1234567890";}//商户号public String getMchID() {return "1234567890";}}
    /*** 获得微信支付二维码* @param req* @param resp* @throws IOException*/@RequestMapping(value = "/getWxPayCode")public void getWxPayCode(HttpServletRequest req, HttpServletResponse resp)throws IOException{MyConfig config = new MyConfig();WXPay wxpay = new WXPay(config);String out_trade_no = DateUtil.dateToStr(new Date(), "yyyyMMddHHmmss");Map<String, String> data = new HashMap<String, String>();data.put("body", "填写商品名称"); //商品描述data.put("out_trade_no", out_trade_no); //商户订单号,不可重复data.put("device_info", "");    //设备号data.put("fee_type", "CNY");    //标价币种(默认人民币)data.put("total_fee", "1");     //标价金额,单位:分data.put("spbill_create_ip", "127.0.0.1");  //终端IPdata.put("notify_url", "https://www.baidu.com/getWxPayNotify.action");  //通知地址,必须是外网能访问的地址data.put("trade_type", "NATIVE");  // 此处指定为扫码支付data.put("product_id", "12");   //商品IDMap<String, String> respnoe = null;try {respnoe = wxpay.unifiedOrder(data);String codeUrl = respnoe.get("code_url");System.out.println("返回的二维码url:" + codeUrl);} catch (Exception e) {e.printStackTrace();}resp.setContentType("text/html;charset=UTF-8");OutputStream os = resp.getOutputStream();ObjectOutputStream oos = new ObjectOutputStream(os);oos.writeObject(respnoe.toString());oos.flush();oos.close();os.close();}

这样就完成了微信支付的二维码请求。在进行请求的时候,微信是以xml格式的数据进行的请求,不过微信已经在提供的jar包里进行了封装,所以我们就不必再进行数据封装了。
商户后台将该二维码地址返回给手机端,手机端通过zxing工具包,将该地址转换成二维码供用户扫码支付。当用户扫码支付完成后,微信后台会回调我们提供给微信后台的接口,就是刚才我们设置的notify_url参数,这里一定要记得是外网能够访问到的地址!
下面是处理微信回调的方法:

/*** 获得微信支付通知回调结果* @param req* @param resp* @throws Exception * @throws IOException*/@RequestMapping(value = "/getWxPayNotify")public void getWxPayNotify(HttpServletRequest req, HttpServletResponse resp) throws Exception {String notifyData = "";try {InputStream is = req.getInputStream();StringBuffer sb = new StringBuffer();  String s;BufferedReader in = new BufferedReader(new InputStreamReader(is, "UTF-8"));while ((s = in.readLine()) != null){  sb.append(s);  }  in.close();  is.close();notifyData = sb.toString();MyConfig config = new MyConfig();WXPay wxpay = new WXPay(config);Map<String, String> notifyMap = WXPayUtil.xmlToMap(notifyData);  // 转换成mapif (wxpay.isPayResultNotifySignatureValid(notifyMap)) {logger.info("支付成功");// 签名正确// 进行处理。// 注意特殊情况:订单已经退款,但收到了支付结果成功的通知,不应把商户侧订单状态从退款改成支付成功}else {// 签名错误,如果数据里没有sign字段,也认为是签名错误logger.error("支付失败");}logger.info("微信支付返回的通知为:" + notifyMap);resp.setContentType("text/html;charset=UTF-8");OutputStream os = resp.getOutputStream();ObjectOutputStream oos = new ObjectOutputStream(os);oos.writeObject(notifyData);oos.flush();oos.close();os.close();} catch (IOException e) {e.printStackTrace();}}

具体的处理方法这里我就不写了,微信回调的时候需要验证签名是否正确,并校验返回的订单金额是否与商户侧的订单金额一致,防止数据泄漏导致出现“假通知”,造成资金损失。另外当微信回调我们的接口的时候,我们需要给微信后台返回应答,已经接收到回调,不然微信将会重新发起通知(通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)

另外当客户端一定时间内没有接收到微信后台的回调时,也可以主动查询订单状态,跟统一下单差不多,只是把下单改为查询

Map<String, String> resp = wxpay.orderQuery(data);

微信扫码支付暂时写到这里,后续如果有什么变化,再添加。附上微信支付的开发文档,里面会有各个参数的说明, 上面的代码没说的太详细。
统一下单:
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1
支付结果通知:
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_7

如需转载,请注明出处!

支付篇—微信扫码支付相关推荐

  1. php验证是否是微信支付,利用thinkphp判断微信中的支付还是微信扫码支付还是手...

    进行判断,根不同的客户端,显示不同的内容,如果不是手机,则只显示扫码微信支付,如果是微信公众号中,则只显示公众号支付 阿里西西web开发网为大家整理了这篇利用thinkphp判断微信中的支付还是微信扫 ...

  2. php CI 微信支付扩展 微信扫码支付 jssdk 支付 退款

    微信支付API类库来自:https://github.com/zhangv/wechat-pay 请先看一眼官方场景及支付时序图:https://pay.weixin.qq.com/wiki/doc/ ...

  3. 支付宝扫码支付和微信扫码支付共存的情况下,如何避免同一个订单被多次支付

    前面分享了一篇 JAVA后端调用微信支付"统一下单"接口实现微信二维码扫码支付 的博客,虽然二维码在生成的时候可以设置有效期,但是这依旧不能保证整个业务流程和数据的安全.因为通常网 ...

  4. 微信支付宝支付代理 微信扫码支付收银系统

    随着城市的多元化,中西结合,现代与古代文化的交融,人们的衣食住行也在发生着翻天覆地的变化,在10年前,出门消费都是现金或者刷卡.而现在你去购物都有会考虑一个问题:能不能用支付宝,微信支付?扫码支付已经 ...

  5. java微信扫码支付_java 微信扫码支付 示例代码

    [实例简介] [实例截图] [核心代码] package main.java; import main.java.Utils.HttpClientUtil; import org.dom4j.Docu ...

  6. Winfrom实现微信扫码支付功能

    winfrom实现微信扫码支付 实现逻辑:生成订单展示二维码-轮询检查支付结果-直到支付成功 看图,是不是你需要实现的效果,我是用的轮询的方式检查是否支付成功 微信扫码支付 下载地址:https:// ...

  7. 微信支付:支付流程分析、微信扫码支付(HttpClient)、微信支付二维码生成、检测支付状态、订单状态操作准备工作、支付信息回调、MQ处理支付回调状态、定时处理订单状态

    微信支付 微信支付开发的整体思路 生成支付二维码 查询支付状态(微信的服务器) 实现订单状态的修改.删除订单 支付状态回查->微信服务器将支付状态返回给支付微服务 MQ处理支付回调状态 Rabb ...

  8. 微信扫码支付初步使用

    微信扫码支付初步使用 一丶对二维码的认知 二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息, ...

  9. 开通微信扫码支付,申请微信扫码支付怎么用

    微信扫码支付是在网页里, 生成一个支付二维码, 让用户用微信扫码支付二维码付款的一种方式. 微信扫码支付是PC电脑端, 用户非常方便的一种方式, 如果你的电脑h5网站想要, 让用户在线付款购买你的产品 ...

最新文章

  1. hashcode java_hashCode方法的作用?
  2. 2016 ACM/ICPC Asia Regional Shenyang Online
  3. 鸡肉部位英文对照_鸡肉和鸡蛋–测试前解决Spring属性
  4. 斯威夫特山地车_斯威夫特| 两个数字相加的程序
  5. 10034 - Freckles 克鲁斯克尔最小生成树!~
  6. 程序员8月薪资新鲜出炉,圈外人却在酸?
  7. error: 'NULL' was not declared in this scope
  8. 用户需求分析:背后隐藏的门槛
  9. THAAD反导必将部署,各方已接受事实
  10. 【读书分享】人性的弱点
  11. 新手初步--Springmvc
  12. 微信小程序报错40163-“errmsg“解决方案
  13. blendshape变形器详细解释
  14. SwiftUI vs 故事板
  15. 数字经济的发展需要包括区块链在内的八大技术的支撑360云储
  16. 我们目前能想到的搞定星际旅行的办法
  17. 模式识别 计算机博弈,六子棋计算机博弈及其系统的研究与优化
  18. PG唯一索引与唯一约束.sql
  19. 为什么网恋男友一直不肯告诉我名字和年龄?
  20. 软件质量管理-5-估算、计划和跟踪

热门文章

  1. 螺旋面 (几何曲面)
  2. 卡诺图在程序中的应用
  3. iOS启动优化之——如何使用Xcode Log、App Launch、代码来计算启动时间 Launch Time
  4. 我不想关注你了,饭否
  5. 机器学习、深度学习、强化学习
  6. 2020年MOOCC语言程序设计精髓第十四周编程题练兵
  7. 自动化测试平台搭建系列(10)——Django框架中的Bootstrap和继承
  8. Photoshop - PS/AE渐变工具出现色带波纹色彩过渡不均匀咋办?
  9. 程序员老黄历Java源码实现
  10. electorn 白屏解决方案(偶发性白屏)