Java=微信支付详解与日志记录详解
一.二维码:
(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=微信支付详解与日志记录详解相关推荐
- Java 微信支付之APP支付服务端 (一)
Java 微信支付之APP支付服务端 (一) 如图所示,这是服务端要集成的所有微信接口.至于在开放平台申请就不做赘述了.主要流程,1.下单,2.异步通知,3.查询. 一.微信统一下单请求交易 /*** ...
- java微信支付代码_Java微信支付之服务号支付代码示例
Java微信支付之服务号支付实现,网上的java微信支付sdk和Demo基本上是水的,看着头疼所以我决心自己开始写Java微信支付之公众号支付,多的不说见下面源码,为了方便使用我分别用了两个Servl ...
- java微信支付超时_Java微信支付之关闭订单
本文实例为大家分享了java微信支付之关闭订单的具体代码,供大家参考,具体内容如下 一.应用场景 商户订单支付失败需要生成新单号重新发起支付,要对原订单号调用关单,避免重复支付 系统下单后,用户支付超 ...
- Java微信支付API文档测试
Java微信支付API文档测试(注意用的微信开发文档是什么支付) 本人用的刷卡支付( 之前看错了,一直在看扫码支付,心塞 ),如图 首先,做一系列准备,获取appid等等,可以写在一个配置文件里面,如 ...
- java微信支付v3系列——6.微信支付查询订单API
目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...
- java微信支付v3系列——1.微信支付准备工作
目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...
- java微信支付v3系列——4.创建订单的封装及使用
目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...
- java微信支付v3系列——7.微信支付之申请退款
目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...
- java微信支付v3系列——8.微信支付之退款成功回调
目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...
最新文章
- leetcode算法题--替换空格
- 怎么把数字替换成空格_剑指offer04:替换空格
- 生成树协议实验报告_STP生成树协议
- SqlServer和MySQL中存储过程out返回值处理C#代码
- 数值计算方法(一)——插值
- lnmp之PDO_mysql.so
- LADRC的学习——PID的学习
- 在小程序中使用腾讯视频插件播放教程视频
- XenApp / XenDesktop 7.6 初体验一 安装, 配置站点和序列号服务器
- Word转换pdf技巧之pdf虚拟打印机怎么用教程
- python 中 函数的使用!!!
- 微信OAuth2接口40163错误怎么解决?
- 一文看懂,Scrapy 底层逻辑是如此的简单
- 【Scrum模式语言5】Scrum of Scrums
- 工程师在创业团队的技术挑战
- 【考研加油】所有上岸的考研人都有一个共同的特点,就是他们都参加考试了。2023考研加油。
- 中国软件:10个人20年坎坷路
- 南阳理工学院计算机应用基础答案,南阳理工学院国家省校级精品课程(精品资源共享课程)一览表.doc...
- !Help | 我又有一个有趣的想法!
- Keil编译出错:“no source“: Warning: #2774-D: ‘=‘ assumed following macro name “USE_STDPERIPH_DRIVER“ in
热门文章
- 微信分享给朋友 图片显示正常,但是分享到朋友圈图片黑色【显示不出来】
- 人人商城提示“app被您禁用啦,可以访问lbsyun.baidu.com/apiconsole/key#”
- C++入门经典 Ivor Horton 第3版
- [前端积累]--响应式布局(二)
- Kubernetes K8S之资源控制器Job和CronJob详解
- php的解析别名,浅谈laravel aliases别名的原理
- 30岁之后想转行,可行吗?这20条建议让你少走弯路!
- 小米路由pro php,家庭实测 | 荣耀路由Pro2 可以吊打小米路由器吗?
- 阿里云播放器AliyunPlayer的走马灯组件的位置
- 慧正工作流注册码获取