微信支付

标签: 微信 分类: 未分类 创建时间:2021-01-29 08:41:36 更新时间:2025-01-17 10:39:23

微信支付分为两个版本
(1) V2版本
一个是统一支付的接口版本,也就是旧的支付接口版本(开发文档首页),这个的支付接口统一为https://api.mch.weixin.qq.com/pay/unifiedorder

(2) V3版本
而最新的接口为V3.0版(开发指引),根据不同的接入场景的支付接口也有所不同,比如使用JSAPI的支付接口为:https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi

关于支付流程都教程其实网上有很多都文章,推荐最近看都一篇 手把手教你接入微信支付 ,我感觉这篇文章写的很好,关于流程,开发,内容等都讲都很详细。

参考文章:
1.基于 WxJava 和 Spring Boot 构建的微信支付示例 (这里封装了WxPay的调用方式,我查了很多的资料,也看了源码,好像这个封装其实也就是一个调用,根本就不是一个示例,比如创建订单的过程,其实也就是调用了官方的一个创建订单接口,然后返回了一个官方给的结果)
2.Wechat-Group/WxJava (官方的Java类库)
4.一文搞懂微信支付 Api-v3 接口规则与具体实现 (这里有V2和V3的版本说明)
5.IJPay 让支付触手可及 (一个集成了多种支付方式的开源代码)
6.什么是API证书?如何获取API证书?

1.微信APP支付流程

主要分为五个步骤:

(1) 用户进入商户APP,选择商品下单、确认购买,进入支付环节。商户服务后台生成支付订单,签名后将数据传输到APP端。

(2) 用户点击后发起支付操作,进入到微信界面,调起微信支付,出现确认支付界面。

(3) 用户确认收款方和金额,点击立即支付后出现输入密码界面,可选择零钱或银行卡支付。

(4) 输入正确密码后,支付完成,用户端微信出现支付详情页面。

(5) 回跳到商户APP中,商户APP根据支付结果个性化展示订单处理结果。

参考文章:
1.场景介绍
2.JSAPI支付

2.H5商城网站支付流程

商户已有H5商城网站,用户通过消息或扫描二维码在微信内打开网页时,可以调用微信支付完成下单购买的流程:
(1)用户打开商户网页选购商品,发起支付,在网页通过JavaScript调用getBrandWCPayRequest接口,发起微信支付请求,用户进入支付流程。

(2)用户成功支付点击完成按钮后,商户的前端会收到JavaScript的返回值。商户可直接跳转到支付成功的静态页面进行展示。

(3)商户后台收到来自微信开放平台的支付成功回调通知,标志该笔订单支付成功。

注:(2)和(3)的触发不保证遵循严格的时序。JS API返回值作为触发商户网页跳转的标志,但商户后台应该只在收到微信后台的支付成功回调通知后,才做真正的支付成功的处理。

3.网页扫码支付流程

就像简书上的打赏功能一样的,点击打赏->选择打赏金额->选择微信支付->调起微信支付二维码->微信上进行支付。除付款码支付场景以外,微信扫码支付,也是使用统一下单接口进行支付,商户系统先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易会话标识后再按Native、JSAPI、APP等不同场景生成交易串调起支付。

统一下单接口调用成功后,return_code 和result_code都为SUCCESS的时候有返回值,其中当交易类型为trade_type=NATIVE时会返回一个code_url参数,此url用于生成支付二维码,然后提供给用户进行扫码支付。(注意:code_url的值并非固定,使用时按照URL格式转成二维码即可)

参考文章:
1.微信扫码支付接口 (这里是扫码支付的使用场景)
2.请问如何在pc端网站调用微信支付的接口 (1.创建订单并调用微信接口,生成二维码;2、在二维码显示页面,增加个 计时器,每隔X秒,查询一次订单状态;3、客户扫码后,你会收到微信的主动通知,根据通知修改订单状态;4、第2步,检测到订单完成,提示客户支付成功)

4.测试代码

V2版本的创建订单的主要代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
* 创建订单
* @param orderId 公司业务订单号
* @param price 价格
* @param body 主题信息
* @param ipAddress 客户端APP IP 地址
* @return
* @throws IOException
*/
public Map createOrder(String orderId, BigDecimal price, String body, String ipAddress) throws IOException {
SortedMap<String, Object> parameters = new TreeMap<String, Object>();
parameters.put("openid","oJ293jtfoSBAZfsf1zDAGmBfClQo"); // 用户的微信id
parameters.put("appid", appid);// 公众号id
parameters.put("mch_id", mch_id);// 商户号
parameters.put("device_info", "WEB"); // 终端设备号,默认 "WEB"
parameters.put("body", body); // 商品描述交易字段
parameters.put("nonce_str", wxUtils.gen32RandomString()); // 32 位随机字符串
parameters.put("notify_url", notifyUrl); // 支付成功之后的通知地址
parameters.put("out_trade_no", orderId); // 系统内部订单编号
parameters.put("total_fee", price.multiply(BigDecimal.valueOf(100)).intValue());
// parameters.put("total_fee", 1); // 测试时,将支付金额设置为 1 分钱
parameters.put("spbill_create_ip", ipAddress);// 微信支付调用的ip地址
parameters.put("trade_type", "JSAPI");// 交易类型,也就是通过什么进行交易,是APP、JSAPI还是什么
parameters.put("sign", wxUtils.createSign(parameters, key)); // 签名,sign 必须在最后
String result = wxUtils.executeHttpPost(placeUrl, parameters); // 执行 HTTP 请求,获取接收的字符串(一段 XML
logger.error(result);
return wxUtils.createSign2(result, key);
}
参考文章:
1.微信支付 Java 实现(服务器端) (从支付到签名,基本上的逻辑以及主要代码已经给出来了,这里使用了)
2.支付验收指引 (这里在接口中添加了sandboxnew的路由参数,实现了微信支付的测试和验收,也就是能实现全部的微信支付接口,但是不会实现真正的转账和付款操作)
3.微信小程序开发之微信支付(三)微信下单 (微信下单的一个简单的代码)
4.Java WxPayUnifiedOrderRequest.setBody方法代碼示例 (这里组装的WxPayUnifiedOrderRequest更加的详细,但是还是没有签名的信息)

5.错误

微信支付报错提示“商户号该产品权限未开通,请前往商户平台>产品中心检查后重试”

(1) 第一步,关联AppID

  • 进入微信支付商户平台->点击产品中心->然后点击AppID账号管理->然后点击关联AppID按钮,将相应的微信公众号的AppID和微信支付进行关联。
  • 打开需要关联的微信公众号->选择左侧的菜单栏->选择微信支付->确认绑定

(2) 第二步,修改代码的”trade_type”为”JSAPI”
我打开了商户平台>产品中心,发现了只开通了JSAPI,像APP等都没有开通,我猜是不是这个trade_type参数就是指示了支付的类型呢,于是我将代码修改为JSAPI

1
2
3
4
5
// 源代码
parameters.put("trade_type", "APP");

// 修改后
parameters.put("trade_type", "JSAPI");

返回的结果果真不一样了。

参考文章:
1.微信支付报错提示“商户号该产品权限未开通,请前往商户平台>产品中心检查后重试”
2.账号关联(AppID绑定) (这里是官方说明账号关联的途径,我找这个微信支付还找了好久了,就在左侧)
3.参数规定 (这里有参数类型的规定,说明了如何传递trade_type参数)

7.支付成功通知

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。