一.二维码:

(1)什么是二维码

二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。

(2)二维码优势:

  • 信息容量大, 可以容纳多达1850个大写字母或2710个数字或500多个汉字

  • 应用范围广, 支持文字,声音,图片,指纹等等...

  • 容错能力强, 即使图片出现部分破损也能使用

  • 成本低, 容易制作

(3)二维码容错级别

  • L级(低) 7%的码字可以被恢复。

  • M级(中) 15%的码字可以被恢复。

  • Q级(四分)25%的码字可以被恢复。

  • H级(高)30% 的码字可以被恢复。

(4)二维码生成插件QRCode

就与jquery开发的一个插件,QRCode是一款基于HTML5 Canvas的纯JS二维码生成插件

下载地址:https://github.com/davidshimjs/qrcodejs

QRCode.js二维码插件的可用配置参数如下:

text String "https://www.baidu.com" 需要编码为二维码的值
width Number 256 二维码的宽度,单位像素。
height Number 256 二维码的高度,单位像素。
colorLight String "white" 二维码的背景颜色。
参数 类型 默认值 描述
colorDark String "black" 二维码的前景颜色。
correctLevel String QRCode.CorrectLevel.L 二维码的误差校正级别(L, M, Q, H)。

入门:

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>demo</title><script src="js/jquery-3.3.1.js"></script><script src="js/qrcode.min.js"></script>
</head>
<body>
<div id="qrCode"></div><script>// 参数一 div的id , 参数二 将xxxx生成二维码// let qrCode = new QRCode('qrCode','https://www.baidu.com');let qrCode = new QRCode('qrCode',{text:'http://www.baidu.com',width:200,height:200,// colorLight: '#e21918',// colorDark: '#0078d7',correctLevel: QRCode.CorrectLevel.M});
</script></body>
</html>

二.扫码支付详解:

(1)微信扫码支付申请

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

申请步骤:

第一步:注册公众号(类型须为:服务号)

请根据营业执照类型选择以下主体注册:个体工商户| 企业/公司| 政府| 媒体| 其他类型。

第二步:认证公众号

公众号认证后才可申请微信支付,认证费:300元/次。

第三步:提交资料申请微信支付

登录公众平台,点击左侧菜单【微信支付】,开始填写资料等待审核,审核时间为1-5个工作日内。

第四步:开户成功,登录商户平台进行验证

资料审核通过后,请登录联系人邮箱查收商户号和密码,并登录商户平台填写财付通备付金打的小额资金数额,完成账户验证。

第五步:在线签署协议

本协议为线上电子协议,签署后方可进行交易及资金结算,签署完立即生效。

(2)开发文档

在线微信支付开发文档:

https://pay.weixin.qq.com/wiki/doc/api/index.html

微信支付接口调用的整体思路

  • 1、商户生成订单

  • 2、商户调用微信下单接口,获取预交易的链接

  • 3、商户将链接生成二维码图片,展示给用户;

  • 4、支付结果通知:

    • 微信异步通知商户支付结果,商户告知微信支付接收情况

    • 商户如果没有收到通知,可以调用接口,查询支付状态

  • 5、如果支付成功,发货,修改订单状态

注意:

前部分我们已经生成订单:

下面我们需要做的就是:

  • 2、调用微信下单接口,生成链接。

  • 3、根据链接生成二维码图片

  • 4、支付成功后修改订单状态

(3)API

统一下单:

请求路径

POST , URL地址:https://api.mch.weixin.qq.com/pay/unifiedorder

请求参数:

字段名 变量名 必填 类型 示例值 描述
公众账号ID appid String(32) wxd678efh56 微信支付分配的公众账号ID
商户号 mch_id String(32) 1230000109 微信支付分配的商户号
随机字符串 nonce_str String(32) 5K8264ILT 随机字符串,长度要求在32位以内
签名 sign String(32) C380BEC2B 通过签名算法计算得出的签名值
商品描述 body String(128) 华为手机 商品简单描述
商户订单号 out_trade_no String(32) 20150806125 商户系统内部订单号
标价金额 total_fee Int 88 订单总金额,单位为分
终端IP spbill_create_ip String(16) 123.12.12.123 APP和网页支付提交用户端ip,Native支付填调用微信支付API的机器IP。
通知地址 notify_url String(256) http://www.weixin.qq.com/wxpay/pay.php 异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。
交易类型 trade_type String(16) JSAPI JSAPI 公众号支付;NATIVE 扫码支付

这些参数大致分成3类:

  • appid、mch_id、spbill_create_ip、notify_url、trade_type:是商家自己的信息或固定数据,可以提前配置,因此无需每次请求单独配置,而是统一设置好即可,

  • nonce_str、sign:是为了保证数据安全而添加的验证数据,根据算法去生成,每次请求自动生成即可。

  • body、out_trade_no、total_fee:订单相关信息,需要我们自己填写。

支付结果通知:

支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。

微信服务会自动向notify_url地址发起POST请求:

通知参数:

字段名 变量名 必填 类型 示例值 描述
返回状态码 return_code String(16) SUCCESS SUCCESS/FAIL此字段是通信标识,非交易标识,交易是否成功需要查看trade_state来判断
返回信息 return_msg String(128) OK 当return_code为FAIL时返回信息为错误原因 ,例如签名失败参数格式校验错误

通信成功,会返回下面信息:

字段名 变量名 必填 类型 示例值 描述
商户订单号 out_trade_no String(32) 1212321 商户系统内部订单号,要求32个字符内
业务结果 result_code String(16) SUCCESS SUCCESS/FAIL

我们需要返回给微信的参数

字段名 变量名 必填 类型 示例值 描述
返回状态码 return_code String(16) SUCCESS 请按示例值填写
返回信息 return_msg String(128) OK 请按示例值填写
<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg>
</xml>

(4)SDK

虽然请求参数比较复杂,但官方已经提供了SDK,供我们使用;

但是微信没有提供maven仓库坐标,因此我们必须下载使用,建议使用资料中,我提供给大家的SDK,其中做了一些必要的设置:

自定义PayConfig实现,定义:公众号id、商户号、账户签名等

提供的SDK打包并安装到本地的maven仓库:

mvn source:jar install -Dmaven.test.skip=true

在项目中引入坐标:

<dependency><groupId>com.github.wxpay</groupId><artifactId>wxpay-sdk</artifactId><version>3.0.9</version>
</dependency>

为了简化引入API参数的封装,封装了工具类:

package com.wsl.util;import com.github.wxpay.sdk.PayConfig;
import com.github.wxpay.sdk.WXPay;
import org.apache.commons.lang3.StringUtils;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;/*** 微信支付工具类*/
public class PayUtils {private static WXPay wxPay;// 支付成功回调地址private static String notifyUrl = "http://a7w.atappfree.cc/travel/PayNotify";// 初始化微信支付static {try {PayConfig payConfig = new PayConfig();payConfig.setAppID("wx12345678900000"); // 公众账号IDpayConfig.setMchID("13456789777");// 商户号payConfig.setKey("T6m933dftttgggrtrrereerrKwb");// 生成签名的密钥wxPay = new WXPay(payConfig);} catch (Exception e) {// e.printStackTrace();throw new RuntimeException(e.getMessage());}}// 生成微信订单支付 urlpublic static String createOrder(String orderId, Integer totalPay) {Map<String, String> data = new HashMap<>();// 商品描述data.put("body", "旅游中心-商品支付");// 订单号data.put("out_trade_no", orderId);//金额,单位是分data.put("total_fee", totalPay.toString());//调用微信支付的终端IPdata.put("spbill_create_ip", "127.0.0.1");//回调地址data.put("notify_url", notifyUrl);// 支付有效时间10分钟Date now = new Date();Date now_10 = new Date(now.getTime() + 600000); //10分钟后的时间SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");//可以方便地修改日期格式String nowTime_10 = dateFormat.format(now_10);data.put("time_expire", nowTime_10);// 交易类型为扫码支付data.put("trade_type", "NATIVE");// 利用wxPay工具,完成下单Map<String, String> result = null;try {result = wxPay.unifiedOrder(data);} catch (Exception e) {throw new RuntimeException("微信下单失败", e);}// 校验业务状态checkResultCode(result);// 下单成功,获取支付链接String url = result.get("code_url");if (StringUtils.isBlank(url)) {throw new RuntimeException("微信下单失败,支付链接为空");}return url;}// 检查业务状态public static void checkResultCode(Map<String, String> result) {String resultCode = result.get("result_code");if ("FAIL".equals(resultCode)) {throw new RuntimeException("【微信支付】微信支付业务失败");}}}

三.支付结果通知实现:

(1)notify_url

统一下单请求参数中有一个非常重要的,叫做notify_url的:

基于上文的介绍我们知道,这个地址是在支付成功后的异步结果通知。官网介绍如下:

支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。

所以,此处的地址必须是一个外网可访问地址,而且我们要定义好回调的处理接口。

http://localhost:8080/travel/pay/notify

注意:通知url必须为直接可访问的url,不能携带参数

(2)内网穿透:

此处我们肯定不能写:http://localhost:8080/travel/pay/notify,这个域名是本地,是不被外网识别的。如何才能获取一个能够外网访问的域名呢?

我们可以通过内网穿透来实现,那么什么是内网穿透呢?

简单来说内网穿透:让外网能访问你本地的应用,例如在外网打开你本地http://127.0.0.1的指向Web站点。

Java=微信支付详解与日志记录详解相关推荐

  1. Java 微信支付之APP支付服务端 (一)

    Java 微信支付之APP支付服务端 (一) 如图所示,这是服务端要集成的所有微信接口.至于在开放平台申请就不做赘述了.主要流程,1.下单,2.异步通知,3.查询. 一.微信统一下单请求交易 /*** ...

  2. java微信支付代码_Java微信支付之服务号支付代码示例

    Java微信支付之服务号支付实现,网上的java微信支付sdk和Demo基本上是水的,看着头疼所以我决心自己开始写Java微信支付之公众号支付,多的不说见下面源码,为了方便使用我分别用了两个Servl ...

  3. java微信支付超时_Java微信支付之关闭订单

    本文实例为大家分享了java微信支付之关闭订单的具体代码,供大家参考,具体内容如下 一.应用场景 商户订单支付失败需要生成新单号重新发起支付,要对原订单号调用关单,避免重复支付 系统下单后,用户支付超 ...

  4. Java微信支付API文档测试

    Java微信支付API文档测试(注意用的微信开发文档是什么支付) 本人用的刷卡支付( 之前看错了,一直在看扫码支付,心塞 ),如图 首先,做一系列准备,获取appid等等,可以写在一个配置文件里面,如 ...

  5. java微信支付v3系列——6.微信支付查询订单API

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

  6. java微信支付v3系列——1.微信支付准备工作

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

  7. java微信支付v3系列——4.创建订单的封装及使用

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

  8. java微信支付v3系列——7.微信支付之申请退款

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

  9. java微信支付v3系列——8.微信支付之退款成功回调

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

最新文章

  1. leetcode算法题--替换空格
  2. 怎么把数字替换成空格_剑指offer04:替换空格
  3. 生成树协议实验报告_STP生成树协议
  4. SqlServer和MySQL中存储过程out返回值处理C#代码
  5. 数值计算方法(一)——插值
  6. lnmp之PDO_mysql.so
  7. LADRC的学习——PID的学习
  8. 在小程序中使用腾讯视频插件播放教程视频
  9. XenApp / XenDesktop 7.6 初体验一   安装, 配置站点和序列号服务器
  10. Word转换pdf技巧之pdf虚拟打印机怎么用教程
  11. python 中 函数的使用!!!
  12. 微信OAuth2接口40163错误怎么解决?
  13. 一文看懂,Scrapy 底层逻辑是如此的简单
  14. 【Scrum模式语言5】Scrum of Scrums
  15. 工程师在创业团队的技术挑战
  16. 【考研加油】所有上岸的考研人都有一个共同的特点,就是他们都参加考试了。2023考研加油。
  17. 中国软件:10个人20年坎坷路
  18. 南阳理工学院计算机应用基础答案,南阳理工学院国家省校级精品课程(精品资源共享课程)一览表.doc...
  19. !Help | 我又有一个有趣的想法!
  20. Keil编译出错:“no source“: Warning: #2774-D: ‘=‘ assumed following macro name “USE_STDPERIPH_DRIVER“ in

热门文章

  1. 微信分享给朋友 图片显示正常,但是分享到朋友圈图片黑色【显示不出来】
  2. 人人商城提示“app被您禁用啦,可以访问lbsyun.baidu.com/apiconsole/key#”
  3. C++入门经典 Ivor Horton 第3版
  4. [前端积累]--响应式布局(二)
  5. Kubernetes K8S之资源控制器Job和CronJob详解
  6. php的解析别名,浅谈laravel aliases别名的原理
  7. 30岁之后想转行,可行吗?这20条建议让你少走弯路!
  8. 小米路由pro php,家庭实测 | 荣耀路由Pro2 可以吊打小米路由器吗?
  9. 阿里云播放器AliyunPlayer的走马灯组件的位置
  10. 慧正工作流注册码获取