前言

这次分享的是java对接微信的支付接口,实现电脑端扫码支付后,跳转支付成功页面的例子。之所以分享是微信的Api太坑了。留下的文档也少,对接过程中容易出现各种各样的问题,在实现这扫码支付功能的时候出现了太多问题。整整对接了5天,每天下班就解决点。仅此分享出来供大家参考,结合自己的业务实现支付功能,要是有问题及时交流哦。不过本次的demo是测试通过才分享的。此处的扫码支付是基于 微信模式二的扫码支付

一、微信扫码支付的条件

1、首先要有 appid ,mchId(微信支付商户号)、apiKey(用户的私钥)有这些才能去对接支付接口。想要获取以上参数前提就是有自己的营业执照去微信官方申请微信支付。

2、条件1是对接的第三方支付。所以才必须要有营业执照。如果只是个人账号则需要对接第四方支付了。不过论稳定性肯定是第三方支付好。因为第四方支付都是基于app监听来实现的。

3、找到微信支付的官方文档去参考,虽然内容不详细,但是也能起参考左右、地址如下:
微信扫码支付:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5

二、开始上扫码支付的效果图

  1. 支付入口

    2、点击立即支付跳转到扫码页面

    页面做到比较简陋,这里是基于链接生成二维码功能将请求微信下单接口返回的二维码链接转换成二维码。
    使用技术:QRCode.js
    参考地址:https://www.runoob.com/w3cnote/javascript-qrcodejs-library.html

3、然后拿起微信扫一扫,支付成功后跳转到自己定义的支付成功页面。

三、开始上代码

1、跳转支付页面

/*** 跳转支付测试页面*/@RequestMapping("/toIndex")public String toIndex(){return "index";}

2、拼装支付参数请求微信统一下单接口
此初的工具类都是基于微信官方sdk提供稍加改造,但是基本内容都没有变,
参考地址: https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1

/*** 跳转微信支付扫码页面* @param orderId 是定位到某个商品的标识,用来点击商品后跳转支付页面* @throws Exception*/@RequestMapping("weixinPay")public String weixinPay(Model model, String orderId) throws Exception{log.info("点击支付按钮跳转扫码页面商品Id",orderId);//系统内部序列,此处是单机模式下使用的序列,如果分布式需要结合redis实现分布式序列GenerateSequenceUtil sequenceUtil=new GenerateSequenceUtil();String outTradeNo = sequenceUtil.generateSequenceNo();//此处使用Map当做微信接口的入参,其他开发者可根据自己需求转成bean封装成支付reqMap map = getMap(outTradeNo);/*** 生成带有 sign 的 XML 格式字符串* 微信支付是xml入参请求*/String xml=WXPayUtil.generateSignedXml(map,apiKey);log.info("微信PC端扫码支付请求同一下单接口入参:{}",xml);// 发送支付请求String resultStr = WeixinUtil.postXml(payOrderUrl, xml);log.info("result=" + resultStr);// xml转mapMap<String, Object> resultMap = XmlUtil.parseXml(resultStr);//签名验证,根据需要选择是否打开// 校验返回结果 签名/** String resultSign = SignUtil.sign(resultMap, apiKey);if (resultMap.get("sign") == null || !resultMap.get("sign").equals(resultSign)) {log.info("sign is not correct, " + resultMap.get("sign") + " " + resultSign);throw new RuntimeException("签名校验不通过");}**///支付结果表PayOrderResult result = BeanUtil.map2Object(PayOrderResult.class, resultMap);//封装页面返参WeixinPageResult pageResult = WeixinPageResult.builder().codeUrl(result.getCodeUrl()).orderId(outTradeNo).weixinOrderId(result.getPrepayId()).build();model.addAttribute("pageResult",pageResult);/*** 根据自己业务记录支付流水表,比如扫码时记录,* 支付后将支付流水表的支付结果修改成已支付,* 此处需要根据自己的业务定,给出自己的预支付流水表的表结构,仅供参考*/ResDetail resDetail=new ResDetail();//int i = orderService.saveResDetail(resDetail);return "weixinPay";}

3、将微信统一下单接口中的返参中codeurl生成二维码

微信接口返参如下

参考地址微信官方Api: https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1

4、如何扫码支付后去跳转支付页面

PS:这才是微信比较坑的地方,扫码支付后不会自动跳转,像支付宝就会有。这个分享的demo是页面写的定时器,定时去调用微信的查询订单接口,查到已支付后就跳转页面。
此方案引发的问题: 可能大家一定会说,
(1)、页面的参数是不安全的,万一有人改了参数,你这次支付就有风险了,
(2)、页面定时去调用后台很可能引发性能问题。
==解决方案:==针对以上问题也可以避免掉的。比如针对问题1:我们可以禁止页面调试,F12无效、不能复制、粘贴修改。但是这都是低层次的。这些手段也能被破解。此处是生成的唯一单号,只要修改页面参数扫码支付后就不会跳转支付成功页面,这样就造成了付完钱也拿不到资源。除非不差钱的兄弟会这样做。这样基本上对自己的业务没有影响。
针对问题2:此处性能可以调大定时的时间,但是因为频繁访问就规避了,那高并发就更不要尝试了,只有遇到瓶颈才能优化哦。
此处上前端定时的代码

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" /><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /><link rel="stylesheet" type="text/css" href="../css/appliystyle.css" /><script type="text/javascript" src="../weixin/jquery.min.js"></script><script type="text/javascript" src="../weixin/qrcode.min.js"></script><script type="text/javascript" src="../jquery.min.js"></script><script type="text/javascript" src="../vector.js"></script>
</head>
<body>
<div id="container">
<div id="output">
<input id="text" type="hidden"  th:value="${pageResult.codeUrl}" style="width:80%" /><br />
<input name="orderId" type="hidden" th:value="${pageResult.orderId}" />
<input name="weixinOrderId" type="hidden" th:value="${pageResult.weixinOrderId}" />
<div style=" background:#5cb85c; color:#5cb85c;border:1px solid blue;height:300px;width:300px;justify-content:center;align-items:center;display:-webkit-flex;width: 230px; height: 230px; position: absolute; left: 50%; top: 50%; margin: -50px 0 0 -50px;border:3px solid #000">
<div id="qrcode" style="border:1px solid blueviolet;height:200px;width:200px;"></div></div>
</div>
</div>
<script type="text/javascript" th:src="@{/weixin/weixinPay.js}"></script>
<script th:inline="javascript">var orderOut = [[${pageResult.orderId}]];var transactionId = [[${pageResult.weixinOrderId}]];
</script>
<script type="text/javascript">var qrcode = new QRCode(document.getElementById("qrcode"), {width : 200,height : 200});function makeCode () {var elText = document.getElementById("text");if (!elText.value) {alert("Input a text");elText.focus();return;}qrcode.makeCode(elText.value);}makeCode();$("#text").on("blur", function () {makeCode();}).on("keydown", function (e) {if (e.keyCode == 13) {makeCode();}});$(function(){Victor("container", "output");$("#entry_name").focus();$(document).keydown(function(event){if(event.keyCode==13){$("#entry_btn").click();}});});/*<![CDATA[*/document.onkeydown = function(){if(window.event && window.event.keyCode == 123) {alert("F12被禁用");event.keyCode=0;event.returnValue=false;}if(window.event && window.event.keyCode == 13) {window.event.keyCode = 505;}if(window.event && window.event.keyCode == 8) {alert(str+"\n请使用Del键进行字符的删除操作!");window.event.returnValue=false;}}document.oncontextmenu = function (event){if(window.event){event = window.event;}try{var the = event.srcElement;if (!((the.tagName == "INPUT" && the.type.toLowerCase() == "text") || the.tagName == "TEXTAREA")){return false;}return true;}catch (e){return false;}}document.onpaste = function (event){if(window.event){event = window.event;}try{var the = event.srcElement;if (!((the.tagName == "INPUT" && the.type.toLowerCase() == "text") || the.tagName == "TEXTAREA")){return false;}return true;}catch (e){return false;}}document.oncopy = function (event){if(window.event){event = window.event;}try{var the = event.srcElement;if(!((the.tagName == "INPUT" && the.type.toLowerCase() == "text") || the.tagName == "TEXTAREA")){return false;}return true;}catch (e){return false;}}document.oncut = function (event){if(window.event){event = window.event;}try{var the = event.srcElement;if(!((the.tagName == "INPUT" && the.type.toLowerCase() == "text") || the.tagName == "TEXTAREA")){return false;}return true;}catch (e){return false;}}/*]]>*/
</script>
</body>
</html>

js


var test1 = setInterval(function(){getOrderQuery();
},5000);function getOrderQuery(){$.ajax({url: "getOrderQuery",type: "POST",dataType: "json",async: true,data: {"orderOut": orderOut,"transactionId":transactionId,},success: function(result){if(result.success){clearInterval(test1);var orderId=result.data.orderId;//跳转支付成功页面--根据自己实际业务跳转window.location.href="";}},error: function(){console.log("系统异常!");}});
}

总结

微信扫码并不难,只是熟悉流程可能麻烦点,只要多尝试就一定对走通的。此处分享就到这里,如果有问题大家在交流。还是希望大家能够自己尝试下支付的对接,只要对接成功后也算是一件鼓励自己的事情了,源码中省略了签名的验证,

ps:源码就不免费提供给大家了,有需要的下载,(源码的运行流程样例:也是下载流程的体现)
代码结构:

地址(不是免费下载) :模式二PC端微信扫码支付 源码获取地址

微信PC端扫码支付 java 模式二的扫码支付相关推荐

  1. PC网站微信扫码支付之Native支付(模式二)

    简介 Native支付是指商户系统按微信支付协议生成支付二维码,用户再用微信"扫一扫"完成支付的模式.该模式适用于PC网站.实体店单品或订单.媒体广告支付等场景. Native支付 ...

  2. 微信pc端网站应用扫码授权登录

    这是官方的文档 对接之前至少要先看下流程图 效果:用户点击微信登录跳出一个二维码,用户扫码授权后登录进去 1. 2. 需要做的事情 1.需要在微信开放平台上面注册账号,并认证企业,创建网站应用 2.认 ...

  3. 微信PC端有了新功能,快来看看你知不知道

    你们知道微信PC端更新了吗?它新增了几个功能,有兴趣了解的朋友就接着往下看吧. 1.文件路径更清晰 微信之前的文件存储路径,都是一串乱码的文件夹,不便于我们查找和管理. 微信更新后,现在接收到的文件路 ...

  4. 微信支付java版v2.0_刷卡支付-翟东平-专题视频课程

    微信支付java版v2.0_刷卡支付-1814人已学习 课程介绍         微信支付系列课程将讲解"刷卡支付"."扫码支付"."公众号支付&qu ...

  5. 微信PC端技术研究(2)-拿下语音

    微信PC端技术研究-保存聊天语音 by anhkgg(公众号:汉客儿) 2019年1月31日 2.6.6.28 0x0. 前言 虽然一直知道CE,也用过一段时间,但一直用不好,可能太笨. 最近又学习了 ...

  6. 微信PC端技术研究(2)-保存聊天语音

    微信PC端技术研究-保存聊天语音 转载地址: [原创]微信PC端技术研究(2)-保存聊天语音-软件逆向-看雪论坛-安全社区|安全招聘|bbs.pediy.com 0x0. 前言 最近又学习了某位大佬用 ...

  7. win7下搭建小程序服务器,重磅!微信PC端支持小程序直接开启 适配Win7及以上系统...

    原标题:重磅!微信PC端支持小程序直接开启 适配Win7及以上系统 腾讯科技讯 8月9日,腾讯科技在"微信开放社区"发现,微信正在测试"PC端支持打开小程序"能 ...

  8. 基于微信PC端小程序抓包方法

    文章目录 前言 一.Proxifier介绍 二.下载及安装 三.使用配置 前言 因为微信小程序基本都是基于HTTPS的,所以抓取HTTPS数据包就是最关键的一步,通过自身实践,推荐使用Proxifie ...

  9. python通过win32api、win32clipboard等包实现微信pc端消息自动发送

    一.先导入要使用的包: import win32api import win32con import win32gui import time import win32clipboard as w 安 ...

最新文章

  1. 目标检测任务中的训练宝典 |实用技巧
  2. 中美科技成果转化比较分析
  3. iOS官方Sample大全
  4. C# WinForm获取 当前执行程序路径的几种方法
  5. Linux定时任务服务crond
  6. 算法题---最长公共前缀
  7. Ubuntu学习笔记2-网络部分
  8. 2015-2016书籍计划
  9. 算法分析c语言版+视频教程,数据结构c语言版
  10. 与计算机审计相关的论文,关于计算机审计类论文范文参考文献,与计算机审计一般原理应用相关硕士毕业论文范文...
  11. BLP模型(Bell-La Padula模型)
  12. 《畅玩NAS》第2章 VMware ESXI安装与使用
  13. 接口文档系统 - Yapi
  14. ARBITRAR: User-Guided API Misuse Detection
  15. 淘客订单检测接口--检测淘宝订单是否是淘客订单的接口
  16. Deployer php自动部署,PHP自动化部署工具-Deployer
  17. 智能手机扬声器、听筒及耳机阻抗及音频效果比较
  18. 服务器临时文件的后缀名,在Java中创建具有指定扩展名后缀的临时文件
  19. 多线程-并发工具类之CyclicBarrier详解
  20. uni-app引用阿里巴巴官方图标库

热门文章

  1. 重构-改善既有代码的设计(四)--构筑测试体系
  2. IfcOpenShell在Ubuntu和Windows下的配置
  3. java poi word bookmarks,java和javascript获取word的 书签位置
  4. 图形学书籍 Real-Time Rendering 3.4 可编程着色和 API 的演变(根据谷歌翻译修改)
  5. 用python画个简易版圣诞树
  6. JOLT的配置与编程简介
  7. python两个变量互换值编程_在编程中实现两个变量的值交换
  8. 计算机信息科学的发展趋势,信息科学技术的长期发展趋势和我国的战略取向
  9. 干货分享 | 写文献综述Literature Review的结构
  10. tripwire-文件指纹