简单实现微信扫码支付开发

@文末附有开发案例代码的地址微信支付开发官方地址:https://pay.weixin.qq.com/wiki/doc/api/index.html 1. appid, 微信公众账号或开放平台APP的唯一标识 2. mch_id, 微信支付系统中的商户收款账号 3. partner, 财付通平台的商户账号 4. partnerkey, 财…

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

版权声明:本文为博主原创文章,未经博主允许不得转载。如需转载请标明原博地址:https://blog.csdn.net/m0_37898659/article/details/81908219

话不多说,先上代码地址:https://download.csdn.net/download/m0_37898659/10617890

主要得几个标识:

微信支付开发官方地址:https://pay.weixin.qq.com/wiki/doc/api/index.html
1. appid, 微信公众账号或开放平台APP的唯一标识
2. mch_id, 微信支付系统中的商户收款账号
3. partner, 财付通平台的商户账号
4. partnerkey, 财付通平台的商户密钥
5. sign, 数字签名, 根据微信官方提供的密钥和一套算法生成的一个加密信息, 就是为了保证交易的安全性

如何获得:
企业在微信公众平台(申请扫码支付、公众号支付)或开放平台(申请APP支付)按照相应提示,申请相应微信支付模式。微信支付工作人员审核资料无误后开通相应的微信支付权限。微信支付申请审核通过后,商户在申请资料填写的邮箱中会收取到由微信支付小助手发送的邮件,此邮件包含开发时需要使用的支付账户信息。

一、流程图

这里写图片描述

二、搭建开发环境

1、ecilpse中创建Web工程
2、拷贝四个jar包
这里写图片描述

      第一个:日志包
      第二、三个:网络通讯使用的jar
      第四个:xml解析使用的jar

3、拷贝两个js文件
二维码生成的js文件
这里写图片描述

4、src下创建servlet、utils包
1、 拷贝四个工具类到utils包里
第三个PayConfig 是:支付参数的java类
这里写图片描述

三、生成订单xml格式数据
1、准备订单支付确认页面
例如demo中的 order.jsp
2、修改扫码支付按钮跳转到二维码页面
这里写图片描述
3、创建NativeServlet
1、 在dopost方法中定义微信官方要求xml格式数据字符串

      String xml = "<xml>" + "<appid>" + PayConfig.appid + "</appid>"
+ "<mch_id>" + PayConfig.partner + "</mch_id>" + "<nonce_str>"
+ nonce_str + "</nonce_str>" + "<sign>" + sign + "</sign>"
+ "<body><![CDATA[" + body + "]]></body>" + "<out_trade_no>"
+ out_trade_no + "</out_trade_no>" + "<attach>" + attach
+ "</attach>" + "<total_fee>" + totalFee + "</total_fee>"
+ "<spbill_create_ip>" + spbill_create_ip+ "</spbill_create_ip>" + 
"<notify_url>" + PayConfig.notifyurl + "</notify_url>" + 
"<trade_type>" + trade_type + "</trade_type>" + "</xml>";

2、创建一个空的map集合用来装载 xml用的数据
微信支付后台必须传过去的:
appid:公众号的appid
paryner:财付通收款账号
nonce_str:随机字符串
body:商品名
attach:额外的附加数据(不是必须的,看业务逻辑)
out_trade_no:订单号
totalFee:支付总金额(我们平时用的单位是:元,需要转换为微信支付官方的单位:分)
spbill_create_ip:当前电脑的ip地址
notifyurl: 回调的url
trade_type:支付方式(官方规定扫码支付为:NARTIVE)
sign:数字签名
这里写图片描述

3、生成订单并获取订单数据
//微信支付官方统一下单接口链接:
URL地址:https://api.mch.weixin.qq.com/pay/unifiedorder
把xml格式的数据发送到这就好了

使用httpCilent工具类的方法即可
开启https协议
这里写图片描述
在服务器生成订单并返回数据给你
这里写图片描述
这个是微信支付后台返回的xml格式的字符串(需进行异常处理)

5 、解析xmlStr (因为二维码页面需要的1是json数据)
这里写图片描述
里面内容非常多,但是对于我们来说只要其中用于支付的url地址就好
这里写图片描述
这里写图片描述
6、人工拼接成json数据
需要订单号、和上面得用于支付得url地址
String resJson=”{\”code_url\”:\”“+code_url+”\”,\”out_trade_no\”:\”“+out_trade_no+”\”}”;
然后返回到页面上
这里写图片描述

四、生成用于支付得二维码
1、创建二维码页面(native.jsp)
1、导入js文件
这里写图片描述
2、给定一个div用于装二维码
这里写图片描述
3、编写js代码
①发送异步请求
打开页面,自动发送请求

     $.post("${pageContext.request.contextPath}/NativeServlet",{},function(data){ 
   
           //第一个参数是访问servlet得url地址,访问后返回得json数据会放到data中
           //第二个参数是发送得参数,这次不用,所以为空
           //第三个是回调函数
                 var url=data.code_url;
                 var out_trade_no=data.out_trade_no;

                 //生成二维码(注意:二维码生成可能根据api不用而不同)
                 var qr=qrcode(10,"H");
                 qr.addData(url);
                 qr.make();
                 $('#qrcode').html(qr.createImgTag());
                 $('#qrtext').html("请打开手机微信进行扫描");

           });

五、准备查询支付状态的数据
1、准备检测客户支付状态的servlet(PayStatusCheckServlet)

1、servlet中另外创建查询某订单支付状态的方法

xml格式要求的字符串:

String xml = "<xml>" + "<appid>" + PayConfig.appid + "</appid>"
+ "<mch_id>" + PayConfig.partner + "</mch_id>"
+ "<out_trade_no>" + out_trade_no + "</out_trade_no>"
+ "<nonce_str>" + nonce_str + "</nonce_str>" + "<sign>" + sign
+ "</sign>" + "</xml>";

这里写图片描述
2、 准备treeMap集合
这里写图片描述
3、发送查询
微信官方查询订单的API:
接口链接:https://api.mch.weixin.qq.com/pay/orderquery
这里写图片描述

4、获取返回的数据
这里写图片描述
5、解析返回的xml
返回的是一个map集合,把方法体的void修改为 Map<String,String>
添加return map;
这里写图片描述
这里写图片描述
6、在dopost中调用检测的方法
(1)、 但是在实际的应用中,客户可能扫描了二维码之后,也许会不支付,所以要不停的调用检测的方法 每三秒 进行检测支付状态。
这里写图片描述
(2)、判断 超时支付的情况
检测时间 — 方法初始时间 > 30秒就break;
这里写图片描述
(3)、判断支付状态
支付成功就退出循环并且返回trade_state
这里写图片描述

7、查询的最终结果要返回二维码页面
(1)二维码一生成就马上检测支付状态
这里写图片描述
(2)通过异步请求 发送请求获取数据
需要传送一个订单号到servlet中:
所以要把 第一个生成二维码的异步请求中获取到的订单号定义在外围,方便两个异步请求都可以用。如图:
这里写图片描述
放到第二个异步请求中:
这里写图片描述
支付成功,则支付状态返回到回调函数的data中
接着判断是否支付成功
失败则重新刷新,重新支付
这里写图片描述
8、支付结果页面
先在异步请求中修改代码,如果支付成功,则跳转到notify.jsp页面
这里写图片描述
创建notify.jsp
在页面中展示微信支付后台返回的数据

想要拿到返回的数据,在servlet中检测的时候要要把返回的Map集合放到Session中,再从页面中把Session取出来用El表达式展示。
这里写图片描述
notify页面中用EL表达式展示代码:
这里写图片描述

测试:
1、部署到tomcat
访问localhost:8080/WeChatPay/order.jsp
这里写图片描述
点击扫码支付,进入二维码页面
这里写图片描述
二维码正常生成
手机扫码支付,完成之后,跳到支付结果页面;
这里写图片描述

纪念我第一篇文章,加油

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119813.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 锐捷交换机配置保存到计算机,锐捷交换机常用配置命令汇总「建议收藏」

    锐捷交换机配置保存到计算机,锐捷交换机常用配置命令汇总「建议收藏」前面我们给大家汇总了华为、华三交换机的配置命令,都是非常适合小项目的,当然碰到大型的网络工程,还是需要厂家的专业人才来做。今天再给大家分享一下锐捷交换机的配置命令,这样国内三大家就全部都有了,学习一些基础网络知识还是不错的,尤其在视频监控系统中应用一下,还是可以的。正文:一、连接及远程登录用一台计算机作为控制台和网络设备相连接,通过计算机对网络设备进行配置。1、硬件连接把Console线一端连接在…

    2022年6月26日
    90
  • Vista初探_Vista Alegre

    Vista初探_Vista Alegre昨天安装了手中的WindowsVistaBusiness,经过几个小时的摸索,我对Vista这个大块头有了一些个人体会,拿出来给大家分享。一、安装及激活:从安装开始说,在我安装之前,我已经有WindowsXP和Ubuntu两套操作系统,启动由Linux的Grub引导,如何把Vista装进硬盘又不影响Ubuntu的启动是第一个需要解决的问题。(以下括号内为题外话,如果你觉…

    2022年10月11日
    2
  • BigDecimal保留两位小数及格式化成百分比[通俗易懂]

    BigDecimal保留两位小数及格式化成百分比[通俗易懂]BigDecimal保留两位小数及格式化成百分比在项目中经常会用到小数的一些计算,而float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。但是,商业计算往往要求结果精确。所以有时候必须要采用BigDecimal。publicc…

    2022年9月23日
    6
  • awvs13使用教程_脚本网

    awvs13使用教程_脚本网你可以在以下渠道联系到我,转载请注明文章来源地址~知乎:Sp4rkWGITHUB:Sp4rkWB站:一只技术君博客:https://sp4rkw.blog.csdn.net/联系邮箱:getf_own@163.com文章目录前言核心接口仪表盘接口新增任务接口设置扫描速度启动扫描任务丝滑脚本前言最近在改reaper的awvs互动功能,因为自己的服务器垃圾,一次最多扫四个站,否则就卡死了。所以需要对现有的批量脚本进行修改处理。逻辑比较简单:拿到web资产,django异步启扫描任务从l

    2022年9月22日
    3
  • 一阶倒立摆的起摆与稳摆simulink仿真

    一阶倒立摆的起摆与稳摆simulink仿真**一阶倒立摆的起摆与稳摆simulink仿真**目录:倒立摆的稳定倒立摆的起摆模型仿真结果1.倒立摆的稳定根据现代控制工程这本书中介绍的状态反馈法控制其中J为配置的极点矩阵,K为得到的反馈增益矩阵。搭建simulink模型,并加入一个阶跃信号。稳摆的结果(下图分别为小车的位移和摆杆的角度)2.倒立摆的起摆起摆过程中采用能量法3.模型仿真结果根据…

    2022年8月18日
    11
  • intrllijidea 永久激活码_在线激活

    (intrllijidea 永久激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlMLZPB5EL5Q-eyJsaWN…

    2022年3月21日
    99

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号