微信网页支付小白指南-域内浏览器支付 + 外部浏览器支付

news2024/11/15 8:01:22

 

关于微信网页支付,分为微信域内浏览器支付 + 外部浏览器支付,两者还是稍微有点点区别的,内部浏览器即在微信内打开网页,进行支付,支付调用是需要开通JSAPI支付方式;而外部浏览器「比如浏览器等」则需要开通 H5支付方式。

准备工作

接入说明

开通H5微信支付-V3,用于移动端H5网页调起微信支付进行付款功能。

微信支付需准备商户号、微信社交载体(公众号/小程序/开放平台)、网站备案域名

公众号平台申请-注册服务号(主体信息与商户平台、网站域名备案主体一致)

微信公众平台

商户平台(需备案,与公众号平台、网站域名备案主体一致)

接入微信支付 - 微信商户平台

API参数获取说明

微信社交载体-AppId

appId是微信社交载体身份的唯一凭证,所以需要申请公众号/小程序/开放平台后,获取对应的appId

微信社交载体-appSecret

appSecret是APPID对应的接口密码,用于获取接口调用凭证-accessToken时使用(微信支付已将获取accessToken部分功能封装,无需自己开发),可登录微信社交载体获取AppSecret。

商户平台-mchId(商户号)

mchId是微信商户平台的身份凭证,且每个mchId只能对应一个结算币种,若要使用多个结算币种,则需要申请相应数量的mchId。注册并登录商户平台后,查看账号信息,以获取对应的mchId

商户平台-APIKey

登录微信商户平台,进入【账户中心 > API安全】目录,设置APIV3密钥。内容为32位字符,包括数字及大小写字母,此时需要输入操作密码及管理员手机验证码。

商户平台-商户证书密钥-privateKey

登录微信商户平台,进入【账户中心 > API安全】目录,申请API证书,在弹出窗口内点击点击“下载证书工具”按钮下载证书工具,该工具为.exe格式,需要在windows环境下运行安装。根据证书工具的提示操作,直至生成证书文件至电脑。

打开生成的证书文件夹,其中apiclient_key.pem便是我们需要的商户证书密钥文件,使用文本编辑器打开,复制内容即可。

商户平台-商户证书序列号-mchSerialNo

同证书密钥-登录微信商户平台,进入【账户中心 > API安全 】目录,申请API证书后,在API证书一栏 会 显示该序列号。

java配置样例:

wx:
  pay:
    appId: #公众号或者小程序appid
    mchId:  #商户id
    apiV3Key:  #V3密钥
    certSerialNo: #证书序列号
    privateKeyPath: #证书key路径
    privateCertPath:  #证书路径

H5支付(域外)

整体流程

官方文档: 开发指引-H5支付 | 微信支付商户平台文档中心

1、用户在商户侧完成下单,使用微信支付进行支付

2、由商户后台向微信支付发起下单请求(调用统一下单接口)注:交易类型trade_type=MWEB

3、统一下单接口返回支付相关参数给商户后台,如支付跳转url(参数名“mweb_url”),商户通过mweb_url 调起微信支付中间页

4、中间页进行H5权限的校验,安全性检查

5、如支付成功,商户后台会接收到微信侧的异步通知

6、用户在微信支付收银台完成支付或取消支付,返回商户页面(默认为返回支付发起页面)

7、商户在展示页面,引导用户主动发起支付结果的查询

遇到的问题

  1. java调用V3接口统一下单时,会报 Illegal key size 报错问题,你的代码是没错的,jdk的问题
javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1029)
javax.crypto.Cipher.implInit(Cipher.java:795)
javax.crypto.Cipher.chooseProvider(Cipher.java:854)
javax.crypto.Cipher.init(Cipher.java:1374)
javax.crypto.Cipher.init(Cipher.java:1308)
com.focustech.common.codec.encrypter.AES256Encrypter.cipher(AES256Encrypter.java:37)
    com.focustech.common.codec.encrypter.AES256Encrypter.encrypt(AES256Encrypter.java:45)

原因是:如果密钥大于128, 会抛出java.security.InvalidKeyException: Illegal key size 异常. 因为密钥长度是受限制的, java运行时环境读到的是受限的policy文件. 文件位于jdk/jre/lib/security,

解决办法:

替换jdk 与jre下两个jar包:local_policy.jar和 US_export_policy.jar即可。见附件

📎UnlimitedJCEPolicyJDK8.rar

  1. 你的请求必须是从添加的H5域名相同,否则下单链接可以获取,但是支付不能成功

  1. 链接不能通过浏览器直接打开,会报下面的错误。你必须在app或者H5里面使用代码打开。

当前调用H5支付的referer为空导致,你需要在app或者H5里面使用代码打开,或者发起支付是,手动设置referer。 如果是webview中,手动设置referer., referer必须是申请H5提交时的授权域名。

JSAPI支付(域内)

整体流程

微信内部浏览器支付,支付时会直接调起微信支付,不同于外部浏览器支付,内部浏览器支付首先需要获得当前支付用户对该公众号的唯一标识 openId,拿到 openId 后,结合后端其他参数调用微信预支付接口,获得预支付id,然后交由前端发起微信支付,支付成功后回调后端接口。

官方文档:开发指引-JSAPI支付 | 微信支付商户平台文档中心

  1. 【服务端】JSAPI下单

重要入参说明

package:JSAPI下单接口返回的prepay_id参数值,提交格式如:prepay_id=***

signType:该接口V3版本仅支持RSA

paySign:签名

paySign生成规则、响应详情及错误码请参见 JSAPI调起支付接口文档

  1. 【客户端】JSAPI调起支付
  2. 【服务端】接收支付结果通知
  3. 【服务端】查询订单

遇到的问题

  1. 配置token , 报token失败?

需要公网下,接受微信的验证消息,并且返回正确值, java代码示例

@GetMapping(value = "/mp/portal",produces = "text/plain;charset=utf-8")
    public String authGet(
                          @RequestParam(name = "signature", required = false) String signature,
                          @RequestParam(name = "timestamp", required = false) String timestamp,
                          @RequestParam(name = "nonce", required = false) String nonce,
                          @RequestParam(name = "echostr", required = false) String echostr) {

        LOGGER.info("\n接收到来自微信服务器的认证消息:[{}, {}, {}, {}]", signature,
                timestamp, nonce, echostr);
        if (StringUtils.isAnyBlank(signature, timestamp, nonce, echostr)) {
            throw new IllegalArgumentException("请求参数非法,请核实!");
        }

        if (wxMpService.checkSignature(timestamp, nonce, signature)) {
            return echostr;
        }

        return "非法请求";
    }

  1. JSAPI微信支付必须要openid,怎么获取openid?

官方文档: 网页授权 | 微信开放文档

第一步,用户同意授权,获取 code

code 是用来取得 openid 的钥匙,先访问微信指定的api取得 code,再拿 code 去换取 openid 是第一步要做的事情。

获取 code 只需按照微信给出的固定访问方式,拼接参数,请求指定接口,如无错误即可获得,详见下

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

第二步,AppID + AppSecret + code 获取 openid

首先,通过公众号的 微信公众平台 开发 基本配置 开发者ID 开发者密码(AppSecret) IP白名单 ,获取 AppID 和 AppSecret 两个关键信息(APPID第一步已经获得),需要注意的是,虽然微信的官方Wiki教程中并没有提到设置IP白名单,但在设置 AppSecret 时是被提示需要一并设置的。

按开发文档要求拼接参数,请求以下链接获取access_token, 同时可以获取到openid

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

  1. 前端如何唤起支付?
function onBridgeReady() {
  WeixinJSBridge.invoke('getBrandWCPayRequest', {
    "appId": "wx2421b1c4370ec43b",     //公众号ID,由商户传入     
    "timeStamp": "1395712654",     //时间戳,自1970年以来的秒数     
    "nonceStr": "e61463f8efa94090b1f366cccfbbb444",      //随机串     
    "package": "prepay_id=up_wx21201855730335ac86f8c43d1889123400",
    "signType": "RSA",     //微信签名方式:     
    "paySign": "oR9d8PuhnIc+YZ8cBHFCwfgpaK9gd7vaRvkYD7rthRAZ\/X+QBhcCYL21N7cHCTUxbQ+EAt6Uy+lwSN22f5YZvI45MLko8Pfso0jm46v5hqcVwrk6uddkGuT+Cdvu4WBqDzaDjnNa5UK3GfE1Wfl2gHxIIY5lLdUgWFts17D4WuolLLkiFZV+JSHMvH7eaLdT9N5GBovBwu5yYKUR7skR8Fu+LozcSqQixnlEZUfyE55feLOQTUYzLmR9pNtPbPsu6WVhbNHMS3Ss2+AehHvz+n64GDmXxbX++IOBvm2olHu3PsOUGRwhudhVf7UcGcunXt8cqNjKNqZLhLw4jq\/xDg==" //微信签名 
  },
                        function(res) {
                          if (res.err_msg == "get_brand_wcpay_request:ok") {
                            // 使用以上方式判断前端返回,微信团队郑重提示:
                            //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
                          }
                        });
}
if (typeof WeixinJSBridge == "undefined") {
  if (document.addEventListener) {
    document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
  } else if (document.attachEvent) {
    document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
    document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
  }
} else {
  onBridgeReady();
}

支付回调

官方指引文档: 微信支付-开发者文档

由于微信支付回调的参数数据都是加密的,需要解密后,再处理逻辑。

验签

验签的目的是为了确定回调请求来自于微信官方,而非其他第三方。

解密

解密是解密出微信官方回调后resource字段里的 ciphertext 字段。从而实现本身业务

问题

  1. 通知返回给微信,微信重试机制?

接收成功:HTTP应答状态码需返回200或204,无需返回应答报文。

接收失败:HTTP应答状态码需返回5XX或4XX,同时需返回应答报文,格式如下:

如果微信手动商户的应答不是成功或者超时时,微信会认为通知失败,微信会通过一定的策略(如:30分钟共8次)定期重新发起通知,尽可能提高成功的通过率,但是微信不保证通知最终能成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/12555.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Leetcode刷题day2|数组二|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

文章目录一、有序数组的平方错误的尝试思路注意AC代码暴力版本双指针方法二、长度最小的子数组错误的尝试思路滑动窗口介绍注意AC代码三、螺旋矩阵错误的尝试思路注意AC代码继承前边循环变量的写法不继承前边循环变量的做法四、数组做题思路总结基本知识解题思路一、有序数组的…

将爱心代码设为电脑屏保,俘获少女芳心,还能假装黑客,在酷炫的界面中保护隐私

本文介绍 Hacker Screen Saver 一款开源 Windows 屏保的使用。Hacker Screen Saver 是一款 .NET 设计的屏幕保护程序,可以显示 HTML 页面,你可以将黑客模拟器的网页,或者爱心代码网页设置为你的 Windows 电脑屏保。详细介绍了软件的使用和对应…

apritag 定位记录 C++ opencv 3.4.5

参考:2021-06-23 基于AprilTag的位姿估计,原理,完整代码(相机坐标系、世界坐标系) - 简书 Apriltag使用之二:方位估计(定位)_arczee的博客-CSDN博客_apriltag位姿估计 1.AprilTag概述 AprilTag是一种视觉…

Matlab:绘制日期时间

Matlab:绘制日期时间绘制日期时间数据指定坐标区范围指定刻度值指定刻度格式存储日期时间的坐标区属性导出和转换数据提示值绘制来自文件的日期时间数据此示例说明如何使用存储为 datetime 和 duration 数组的日期时间创建线图。datetime 数据类型表示时间点&#x…

Linux I/O 原理和 Zero-copy 技术全面分析

两万字长文从虚拟内存、I/O 缓冲区,用户态&内核态以及 I/O 模式等等知识点全面而又详尽地剖析 Linux 系统的 I/O 底层原理,分析了 Linux 传统的 I/O 模式的弊端,进而引入 Linux Zero-copy 零拷贝技术的介绍和原理解析,将零拷贝…

项目终于收尾了,第一次体验到专业项目管理软件的魅力

转眼到了年底,我跟进的项目也到了收尾阶段。之前陆陆续续给大家分享了入职新公司后,使用新引进的项目管理软件做项目的一些体会和心得,其中一些比较高效便捷的技巧和功能模块也引起了大家的兴趣。 最近刚好临近项目尾声,也给大家…

Maven的详解

在java中Maven就是一个包管理工具,在没有包管理工具时,我们要做一个java项目,需要第三方依赖包,将别人打包好的Jar包下载到本地,然后手动指定给项目.操作比较麻烦,比如版本控制,有的甚至还有其他包的依赖,属实是繁琐,技术是不断地迭代的,所以就出现了Maven,用了Maven之后,需要什…

安装nodejs的详细流程保姆级(踩了无数次坑)

node 简述: node的使用已经是前端选手基本的选择,其强大的功能甚至到了要和后端抢活干的地步,同时想要搭建个人的博客用node工具也是非常方便的,作为一名后端选上,刚开始准备下载node的时候是因为想要去搭建个人的博客,但是下载之后,使用npm install命令的时候一直报错,无奈找…

G1D14fraudgitpipenvdf操作APT论文RCE37-40服务器搭建

一、fraud 突然发现电脑上还没有python编译器,xswl,快装一下 (一)git操作 (二)git中分支的作用 (三)虚拟环境 1、pip install后的包一般放在哪里 lib/site-packages下 真的是欸&a…

LiveData

LiveData是一个抽象类,那么我们从简单的MutableLiiveData开始剖析,先看源码 源码太简洁了,就是继承LiveData,然后重写了父类的方法,并且没有多余的操作,都是直接使用父类方法里的逻辑,那我们就根…

安全防护的原则

电力行业 工控安全解决思路保障框架从电力行业对工控安全需求看,电力企业在主要是以合规性建设为主,在 2004 年原电监会 5 号令颁布开始,大部 分的电厂控制系统安全 建设已经按照 5 号令的要求进行了整改,形成“安全分区、网络专…

数电笔记总结(三)(逻辑门电路)

目录逻辑门基础逻辑门电路分立元件基本逻辑门电路TTL集成门电路(与非门)两种特殊门(重点)1.集电极开路门(OC门)2.三态门电路逻辑门基础 逻辑门电路 门电路:具有控制信号通过或不通过能力的电路…

某某桥的检测和加固设计

目录 某某大桥桥梁检测及加固设计报告 1 0 总论 2 0.1 检测目的 2 0.2 桥梁结构混凝土强度检测[1] 2 0.3 结构综合评定指标 4 0.4桥梁承载能力[3] 4 0.5 桥梁结构荷载试验 6 0.6 主要结果与结论 8 1某某大桥简介 11 1.1某某大桥简介 11 1.2 检测仪器与设备 15 2 外观检查与检测…

【跟学C++】C++STL标准模板库——算法整理(上)(Study18)

文章目录1、STL简介2、STL算法分类及常用函数2.1、非变序算法2.1.1 计数算法(2个)2.1.2 搜索算法(7个)2.1.3 比较算法(2个)3、总结 【说明】 大家好,本专栏主要是跟学C内容,自己学习了这位博主【 AI菌】的【C21天养成计划】,讲的十分清晰&am…

每个程序员都要知道的一个网站

在日常开发过程中,你是不是经常回到搜索引擎,搜索某个功能的实现方式,比如:Javascript 数组排序、正则表达式等等。 今天给大家推荐的这个网站,就可以满足大家的需求,它叫:30secondsofcode&…

抽象类与接口

目录 1. 抽象类 1.1 抽象类概念 1. 2🐔抽象类特性 1.3 抽象类的作用 2. 接口 2.1 接口是什么 2.2 语法规则 2.3 方法的使用 2.4 接口特性 2.5 实现接口 VS 继承类 2.6 抽象类 VS 接口(总结) 2.6 接口间的继承 🐓 随着…

漫画脸头像怎么制作?这几种方法可以帮到你

你们会经常更换头像吗?我身边就有一些朋友会这样做,看到喜欢的头像就换,而且他基本上都是找那些漫画脸来当头像。那如果我们把自己的人像制作成漫画脸,就不容易跟别人撞头像了,还显得有个性。 估计有很多小伙伴不知道漫…

NXP BootLoader源码分析并改写SD卡启动

1 官方资料 NXP官方提供了MCUBoot SDK:NXP_Kinetis_Bootloader_2.0.0 package,里面包含了各种型号芯片的的BootLoader。 BootLoader参考手册:doc/Kinetis Bootloader v2.0.0 Reference Manual.pdf上位机程序参考手册:Kinetis Fl…

疯狂小杨哥被王海打假

我是卢松松,点点上面的头像,欢迎关注我哦! 知名打假人王海 发布视频,说疯狂小杨哥三只羊直播间售卖的金正破壁机和绞肉机虚标功率。破壁机标注功率为300W,实际为105W,绞肉机标注功率300W,实际功…

[附源码]java毕业设计咖啡销售管理系统-

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…