uniapp对接微信APP支付返回requestPayment:fail [payment微信:-1]General errors错误-全网总结详解

一、问题描述

uniapp对接微信APP支付,本来是很简单的一件事,后端本来就是好的,只要填一些参数就行了,搞了我一晚上,主要卡在uniapp这边,拉起支付的时候,一直提示以下错误:

{"errMsg": "requestPayment:fail [payment微信:-1]General errors","errCode": -100,"code": -100
}

返回 -1 大部分原因出在包名,签名,和参数部分为空或不对导致的

全网各类关于该错误的教程都看了,最后终于成功解决,-1错误官方的解释如下:APP调起支付 - App支付 | 微信支付商户文档中心

可能得原因还挺多的,并没有详细的错误信息,安全靠猜。

以下问题是来自官方或者网上的解决方法:

uniapp接入v3返回-1 | 微信开放社区

​
1、使用签名检查工具(https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=20_1)校验签名算法是否有误
2、确认秘钥是否有误(服务商模式使用服务商商户号秘钥,秘钥是在商户平台配置,如果同一商户号调用其它接口成功可排除是秘钥问题)
3、确认接口实际的请求参数与生成签名原串的参数一致,不能增加或缺少参数(可通过打印签名原串进行排查)
4、确认参数的大小写,参数名与接口文档一致
5、签名原串的参数值使用原始值,不需要encode
6、接口需要使用UTF-8编码
7、IOS正常,安卓异常的情况下,请排查包名与包签名
8、未注册APPID
9、项目设置APPID不正确
10、注册的APPID与设置的不匹配
11、服务商模式下,统一下单中的sub_appid是否有传入
12、“唤起支付接口”中的签名类型是否与“统一下单接口”的类型一致
13、微信缓存问题,卸载微信重新安装
14、uni.requestPayment参数大小写问题以及数据为空appid,noncestr,package,partnerid,prepayid,timestamp,sign 都不为空或者不为undefind
15、参数类型(orderInfo)
如果是微信支付,上传参数需要是 Object 对象,而不能是 String 类型。
不然可能只会出现一个加载框,就是不跳转到支付页面。
App端,支付宝支付 orderInfo 为 String 类型。
App端,微信支付 orderInfo 为 Object 类型。
16、是否使用了自己生成的keystore证书,千万别用uniapp的免费证书

二、解决方法

以下是参考微信官方以及网上的一些解决思路,请根据自身问题进行排除,首先从注册以及配置开始,确保前面几步没有错。

 微信支付注册以及配置相关

首次开通需要注册两个平台

1.1微信商户

关于V2和V3


 

1.2微信开放平台

创建APP

按要求填写资料,可参考官方的文档:开发指引 - APP支付 | 微信支付商户文档中心

其中最重要的就是app的包名以及签名

应用包名:是在App项目配置文件AndroidManifest.xml中声明的package值,例如上图中的package="demo.wxpay.tenpay.com"。

应用签名:根据项目的应用包名和编译使用的keystore,可由签名工具生成一个32位的md5串,在调试的手机上安装签名工具后,运行可生成应用签名串,如图所示,绿色串即应用签名。

点击下载签名生成工具

注意:

签名的获取,首先在uniapp里,在打包配置里填写正确的包名已经正式的证书进行打包,参考下面的uniapp准备工作,打包之后进行安装,安装之后通过签名工具获取签名。

应用创建好之后,会得到AppID,AppSecret

默认微信支付是未获得,需要点进去,进行申请

绑定APPID

上面申请成功之后,进入到商户平台,对APPID进行绑定

申请之后,在开放平台中的应用->微信支付->查看详情里->下面有个确认的操作,确认之后就成功的绑定了

uniapp相关配置

使用自有证书进行打包,不要使用测试证书,包名使用自己的如com.xxx.xx,不要使用默认的,默认的是UNI.xxx这种

证书生成参考:Android平台签名证书(.keystore)生成指南

在uniapp配置里配置appid,appid从上面的开放平台获取

上面的几步都设置正确后,下面就先来排查下是服务端的问题还是客户端的问题

服务端排查

1.确认appId,mchId,秘钥这些都没问题

我这里服务端用的是JAVA,用的是官方的SDK:SDK - SDK&开发工具 | 微信支付商户文档中心

 该SDK仅支持V3,所以这里以V3来演示,app支付相关代码

package xxxx;import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAAutoCertificateConfig;
import com.wechat.pay.java.service.payments.app.AppServiceExtension;
import com.wechat.pay.java.service.payments.app.model.PrepayRequest;
import com.wechat.pay.java.service.payments.app.model.PrepayWithRequestPaymentResponse;
import com.wechat.pay.java.service.payments.nativepay.model.Amount;/** APP 支付下单为例 */
public class QuickStart {/** 商户号 */public static String merchantId = "1654xxxx";/** 商户API私钥路径 */public static String privateKeyPath = "D:\\idea_work\\cert\\apiclient_key.pem";/** 商户证书序列号 */public static String merchantSerialNumber = "5DFCB4FD7930CCxxxxxx";/** 商户APIV3密钥 */public static String apiV3Key = "xxxxxxxxx";public static void main(String[] args) {// 使用自动更新平台证书的RSA配置// 一个商户号只能初始化一个配置,否则会因为重复的下载任务报错Config config =new RSAAutoCertificateConfig.Builder().merchantId(merchantId).privateKeyFromPath(privateKeyPath).merchantSerialNumber(merchantSerialNumber).apiV3Key(apiV3Key).build();// 构建service//AppService service = new AppService.Builder().config(config).build();AppServiceExtension service = new AppServiceExtension.Builder().config(config).build();// request.setXxx(val)设置所需参数,具体参数可见Request定义PrepayRequest request = new PrepayRequest();Amount amount = new Amount();amount.setTotal(100);com.wechat.pay.java.service.payments.app.model.Amount amount1 = new com.wechat.pay.java.service.payments.app.model.Amount();amount1.setTotal(1);amount1.setCurrency("CNY");request.setAmount(amount1);request.setAppid("wx9xxxx");request.setMchid("1654xxxx");request.setDescription("测试商品标题");request.setNotifyUrl("https://notify_url");request.setOutTradeNo("out_trade_no_001");// 调用下单方法,得到应答PrepayWithRequestPaymentResponse response = service.prepayWithRequestPayment(request);String signStr = String.format("%s\n%s\n%s\n%s\n", response.getAppid(), response.getTimestamp(), response.getNonceStr(), response.getPrepayId());;System.out.println(JsonUtils.toJsonString(response));System.out.println(response.getPrepayId());System.out.println(response.getSign());}
}

如果上面的代码成功执行,会返回如下:

{"appid":"wx9f3ab2xxxx","partnerId":"1654254xxx","prepayId":"wx2713xxxx5571830b157fc3001af10000","packageVal":"Sign=WXPay","nonceStr":"B4PHQp7axxQ6IeTVTuz5SPXxgA7H1Kf3","timestamp":"1695793306","sign":"I6+ZhY/0r8bjJxs+c092oIOTRZpeSl9fAUi6jAWt8n71s4tld41LNOveOePIT6Jca9CW9KWl6Bonx4U610LQlK0SdO5BVXuf8P3A3dixxxx"
}

这样就能确认appId,mchId,秘钥这些都没问题,如果有签名相关的错误,可按如下进行操作。

 2.V2和V3验签验证

V2工具:微信支付接口签名校验工具

如果使用的是V2版本,具体可参考:全网最全v2接口签名报错排查指引!!!! | 微信开放社区

可通过该工具生成支付参数:

然后直接使用postman进行请求测试,不需要什么配置,只要参数跟请求的url

也可以通过该工具对参数进行校验

V3工具:验签工具 - SDK&开发工具 | 微信支付商户文档中心

如果使用的是V3版本,下单时的签名规则如下:APP调起支付 - App支付 | 微信支付商户文档中心

注意签名验签工具明文,最后一行有个换行符。

客户端排查

如果上面返回的数据没问题,基本上可以确认就是客户端这边的问题了,客户端这边可以从下面几个方面来排查:

1.是否使用自定义基座运行,不支持直接通过标准基座调试运行

2.app包名以及签名是否正确

通过上面的自定义基座或者打包出来的app,安装到手机上之后,通过上面的签名工具,输入包名再次确认下签名是否正确

3.uniapp是否正确的配置appid

4.uni.requestPayment参数大小写是否正确以及参数是否为空

官方的代码:uni.requestPayment(OBJECT) | uni-app官网

uni.requestPayment({"provider": "wxpay", "orderInfo": {"appid": "wx499********7c70e",  // 微信开放平台 - 应用 - AppId,注意和微信小程序、公众号 AppId 可能不一致"noncestr": "c5sEwbaNPiXAF3iv", // 随机字符串"package": "Sign=WXPay",        // 固定值"partnerid": "148*****52",      // 微信支付商户号"prepayid": "wx202254********************fbe90000", // 统一下单订单号 "timestamp": 1597935292,        // 时间戳(单位:秒)"sign": "A842B45937F6EFF60DEC7A2EAA52D5A0" // 签名,这里用的 MD5/RSA 签名},success(res) {},fail(e) {}
})

特别要注意这里:

1.orderInfo是个对象不是字符串,
2.里面的参数要仔细对比下,看下自己的是不是一致,如果直接用后台返回的参数填进去,后台返回的参数有些是大写,会导致参数不一致。
3.参数不能为空,都要有值

三、相关问题

网上有人说,微信app支付,不支持真机调试,只能打包成app安装进行测试,经测试,通过基座打包进行调试可以拉起支付。

网上有人说uniapp只支持v2,经测试,同时支持v2和v3,调用requestPayment接口即可,不需要改其他任何东西

uni.requestPayment({"provider": "wxpay", "orderInfo": {"appid": "wx499********7c70e",  // 微信开放平台 - 应用 - AppId,注意和微信小程序、公众号 AppId 可能不一致"noncestr": "c5sEwbaNPiXAF3iv", // 随机字符串"package": "Sign=WXPay",        // 固定值"partnerid": "148*****52",      // 微信支付商户号"prepayid": "wx202254********************fbe90000", // 统一下单订单号 "timestamp": 1597935292,        // 时间戳(单位:秒)"sign": "A842B45937F6EFF60DEC7A2EAA52D5A0" // 签名,这里用的 MD5/RSA 签名},success(res) {},fail(e) {}
})

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js数组/对象的深拷贝与浅拷贝

文章目录 一、js中的深拷贝和浅拷贝二、浅拷贝1、Object.assign()2、利用es6扩展运算符(...) 二、深拷贝1、JSON 序列化和反序列化2、js原生代码实现3、使用第三方库lodash等 四、总结 一、js中的深拷贝和浅拷贝 在JS中,深拷贝和浅拷贝是针对…

数学电路与电子工程1(MEE)—— 锁存器和触发器

1 逻辑综合 1.1 DCB/DEC转换器 下图是一个74HC42集成电路的逻辑图,它是一个二进制编码的十进制(BCD to Decimal)转换器,也称为DCB/DEC转换器。这种类型的IC通常用于将4位二进制数(BCD)转换为十进制输出。 …

PHP文件相关函数大总结

PHP中与文件相关的函数: 以下示例均以读取example.txt为例: example.txt的内容: this is a txt. 这是一个文件 1 .使用 file_get_contents 读取整个文件内容: $fileContent file_get_contents(example.txt); echo $fileContent…

Flink问题解决及性能调优-【Flink rocksDB读写state大对象导致背压问题调优】

RocksDB是Flink中用于持久化状态的默认后端,它提供了高性能和可靠的状态存储。然而,当处理大型状态并频繁读写时,可能会导致背压问题,因为RocksDB需要从磁盘读取和写入数据,而这可能成为瓶颈。 遇到的问题 Flink开发…

MySql8的简单使用(1.模糊查询 2.group by 分组 having过滤 3.JSON字段的实践)

MySql8的简单使用(1.模糊查询 2.group by 分组 having过滤 3.JSON字段的实践) 一.like模糊查询、group by 分组 having 过滤 建表语句 create table student(id int PRIMARY KEY,name char(10),age int,sex char(5)); alter table student add height…

【C/C++ 01】初级排序算法

排序算法通常是针对数组或链表进行排序&#xff0c;在C语言中&#xff0c;需要手写排序算法完成对数据的排序&#xff0c;排序规则通常为升序或降序&#xff08;本文默认为升序&#xff09;&#xff0c;在C中&#xff0c;<algorithm>头文件中已经封装了基于快排算法的 st…

记录我的历程

1、2024年1月30号更新 从2024年1月22号开始复更&#xff0c;已添加20篇文章&#xff0c; 前一阶段&#xff1a;排名1502450、原力分2、粉丝3人

PGsql 解析json及json数组

创建测试数据 drop table if exists json_test; create table json_test as select 111 as id, {"nodes":{"1692328028076":{"nodeId":"1692328028076","nodeName":"测试表1","nodeType":"DATACO…

STM32 OV7725摄像头模块识别颜色物体(1)--HSL二值化和腐蚀中心算法,并用串口输出数据

目录 前言 一、摄像头采集数据流程 二、如何将图像显示到电脑上 三、图像二值化 1、什么是RGB? 2、RGB565转RGB888 I、RGB565和RGB888的区别 II、代码 3、RGB转HSL I、什么是HSL II、转换公式 III、代码 3、输出一张摄像头二值化图片 I、原理 II、代码 四、简单的物体识别 1、…

ElasticSearch搜索引擎入门到精通

ES 是基于 Lucene 的全文检索引擎,它会对数据进行分词后保存索引,擅长管理大量的数据,相对于 MySQL 来说不擅长经常更新数据及关联查询。这篇文章就是为了进一步了解一下它,到底是如何做到这么高效的查询的。 在学习其他数据库的时候我们知道索引是一个数据库系统极其重要…

数字图像处理(实践篇)三十六 OpenCV-Python 使用ORB和BFmatcher对两个输入图像的关键点进行匹配实践

目录 一 涉及的函数 二 实践 ORB(Oriented FAST and Rotated BRIEF)是一种特征点检测和描述算法,它结合了FAST关键点检测和BRIEF描述子。ORB算法具有以下优势: ①实时性:能够在实时应用中进行快速的特征点检测和描述。 ②

[C++]使用纯opencv部署yolov8旋转框目标检测

【官方框架地址】 https://github.com/ultralytics/ultralytics 【算法介绍】 YOLOv8是一种先进的对象检测算法&#xff0c;它通过单个神经网络实现了快速的物体检测。其中&#xff0c;旋转框检测是YOLOv8的一项重要特性&#xff0c;它可以有效地检测出不同方向和角度的物体。…

git用法总结

以gitee为例&#xff0c;GitHub也可参考本文 创建远程仓库 在自己的gitee主页 创建本地仓库 在文件夹下&#xff0c;右键→git bash here git init添加gitignore vi .gitignoregitignore里的内容根据自己实际情况设置&#xff0c;这里举个例子 # #开头的是注释 # Prer…

Oracle篇—分区索引的重建和管理(第三篇,总共五篇)

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…

写静态页面——魅族导航_前端页面练习

0、效果&#xff1a; 1、html代码&#xff1a;&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…

Spring Boot通过配置文件支持数据库自定义表名

直接上干货&#xff1a; 例如一个叫xxx的项目&#xff0c;yml文件里加上这段 xxxproject:db:xxxTable: xxx_dbname #自定义的数据库表名创一个Configuration类放表名和Mapper // XxxProjectAutoConfiguration.javaConfiguration MapperScan(basePackages "cn.com.xxxp…

【vue】defineModel在vue3.4中的最新用法和详解

在2023年12月28日&#xff0c;尤大发布了vue3.4版本&#xff0c;这个版本主要对一些实验性特性的改进&#xff08;比如defineModel&#xff09;&#xff0c;大量重写了模板编译器并重构了响应式系统&#xff0c;可以说是大大提升了运行速度和效率。 之前在vue3.3中defineModel…

分布式ID是什么,以美团Leaf为例改造融入自己项目【第十一期】

前言 在日常开发中&#xff0c;主键id应用是非常广泛的&#xff0c;但是当涉及到分布式系统的时候&#xff0c;往往需要使用到分布式id&#xff0c;每一个服务里面一套生成规则的不易管理&#xff0c;容易引发冲突。我的IM聊天系统中使用分布式id来生成消息唯一键,为后面幂等做…

Flink CEP实现10秒内连续登录失败用户分析

1、什么是CEP&#xff1f; Flink CEP即 Flink Complex Event Processing&#xff0c;是基于DataStream流式数据提供的一套复杂事件处理编程模型。你可以把他理解为基于无界流的一套正则匹配模型&#xff0c;即对于无界流中的各种数据(称为事件)&#xff0c;提供一种组合匹配的…

网络防御安全:2-6天笔记

第二章&#xff1a;防火墙 一、什么是防火墙 防火墙的主要职责在于&#xff1a;控制和防护。 防火墙可以根据安全策略来抓取流量之后做出对应的动作。 二、防火墙的发展 区域&#xff1a; Trust 区域&#xff0c;该区域内网络的受信任程度高&#xff0c;通常用来定义内部…