支付宝 APP支付(证书)方式遇到的问题和解决办法

最近在做支付宝的支付功能,遇到了一些问题记录一下,方便查阅和遇到同样问题的人;

这个错误遇到的应该都比较多吧;

这个问题发生的原因是:

1.私钥是用文件路径方式请求的(建议使用密文方式) 并且 keyFromFile = false ;

2.私钥的获取方式不正确 (正确的是:开发者工具生成后 -> 打开文件位置 ->私钥);

3.获取CSR 文件时没注意看的话,就默认选择了PKCS8 导致错误;

//如果使用 文件方式报错的话,请参考下方案

1.将 开发者工具中 ->打开文件中 获得的私钥文件,增加头部和尾部字符串如下方格式:

-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAhIHUPlqp26ye5kYiWYmOAcVLOliusADxzjNx/bXQFnOBNnkX+aTxOrHkiccd13EAHo10wnHiCYrxKpLS0jSL9puDdOYID1F9ZzZs9O3NN3BQpSx2zKJV4t1QjSVleUkSvXEZ9zIZvksPDOM8fMFiuJKeBsLj2eRrsRqx8GA5jUYkKzdXgyheDAM8tMdEaWJAdE4NN/HIdPg/QIwwju5Q44t9stHLB1FWoffNgyLsbFTe3LLAB25gJfVb592JUtP/hpp2ouOpa9p3hrlN8u2kFsQQb4MFLjS3pen5q6TP/FOZkIltdSnroGDnRlv81CyXG89Qoe24VhMJ/lMNKhPDjwIDAQABAoIBABVRjgQ6MfnV2/rQbdZZ+y7tvxy0B+bpP/4c6MoY5lG2Y6OP9/uCPg1jcZF5JQ4KV+HO3Z/oMMjpsZZ1r0BwWMEdD6jTbixILw8VKCHzG7cKIEvX+QM+uu45xuwKNRc3tC/8WeqnTkBpzV3myMEPxocLWfu5I0+eDYsg7Aheqad1hBuoe11fj00ZaZmmMX860sCJzPnfOTUuZs7ypF7g8dW7JJr0DcEF34ePA1SGa9GWTjzi/DdAlE+DvyPh1OiWZHfY1JVYESC/M4t+oRezRRTC7+OOvjod6JHJZw9HVw4UKhYOFTpX5awHFQoYECgYEAxZdx1luCTmG1Hfr6njA7EQl4VVihEOgrEOw6jhKc1Y/WtXk56MDkGnWdpyqpkEh3PR9eNtaF2DSBPgE1+pA1YmuGRgZCW+gvRVUavhIgkYvxxOwyP+yxAKaOwBY03qR/XsZB7v9x8X5P0cDeZWqYWR7DzK2vvWRtqcu2BkXZi8UCgYEAq60ude+y2gJ5Vb8s6zCLS+TN5s+Oamd/7qZpdrM1fPYHXH6/XftAsD9bKHCQJM2AlfaL0wIpXh8EmM0whNZ5gBE7z3Ja6l5WB4q/i5UvHEPQMJd+hEQRDJieHRkDra6eGsuHlDT6/WI/XblHUw2SbHMCawHGPz+eN7+e/5srY0MCgYBIadIsbuj4dNJ9pEdIxgA/pCrXjF2q5osx7oEfJC8aDVbwtvbEGD0AfW5Dn1z5JbWdTuumSURQEh3zbVos88C8yw8whoa3TAZW8HOWiOoqrRDzzGQ2DTZpOKFEQF8r4TlUsG/lePR3PoVeJ8LZhBFFSAMV9elcDXwrKB8TeXHayQKBgDTHRSVUz7NeV1cZMwILJofqi7KN1Ma5kwcXegzYA3WrXY/+F28ZM0X79FZ2ZJor44A3D72LSJR7DLq9OlFcbnYE1lJsYa7z2Zbv/Ps4ngcegf6uVGLtWiB5OwLPEeZvbIPoVoIl15PWhIyXzWmnHoDgyrmDDiObt1SEQKlsVuZpAoGAWnAamD63DfRc4zqmqGPTVttA84fOf+q2o7NGfhhyo0nFiZZbes5OJpB2ay81gvNYH0x84sanu2U+bGDXHRCAxKzaqByxCZV3/uKHS3l0S4c3lXwaScqbfLKUxDpqQSdI4VuxHLr4XrWW0WPi2YlbWTy3T4Y14GAgd9qPuLGMn5I=
-----END RSA PRIVATE KEY-----

2.

//官方skd源码返回秘钥base64密文
SDK源码地址:https://openhome.alipay.com/doc/sdkDownload.resource?sdkType=NET

private static byte[] GetPem(string type, byte[] data)
{
string pem = Encoding.UTF8.GetString(data);
string header = String.Format("-----BEGIN {0}-----\\n", type); //官方这里是 \\n 请注意如果自己的秘钥文件中有换行则改为 \r\n
string footer = String.Format("-----END {0}-----", type);
int start = pem.IndexOf(header, StringComparison.Ordinal) + header.Length;
int end = pem.IndexOf(footer, start, StringComparison.Ordinal); //如 秘钥文件中 没有出现 头部和底部的(-----BEGIN RSA PRIVATE KEY----- 和  -----END RSA PRIVATE KEY-----) ,则end = -1 导致下面的  (end - start )报错
string base64 = pem.Substring(start, (end - start));  //这里会出错

return Convert.FromBase64String(base64);

}

另外如果秘钥错误可能和生成时有关系,请看如下步骤

下载支付宝开发者签名工具,具体使用方式可以参考支付宝流程;

网址:https://docs.open.alipay.com/291/106097/

注意事项:  生成CSR文件的时候,注意勾选  PKCS1 方式,(默认勾选的是 pkcs8) 这也是我没仔细看,遇到第一个坑,导致程序一直报 私钥格式不正确

然后上传到支付宝的应用环境中;

证书文件都拷贝到自己的程序目录中 ,在下方代码 设置证书相关参数时 使用;

 static void Main(string[] args)
        {
            var path = AppContext.BaseDirectory + "key/";
            string APP_PRIVATE_KEY = "私钥字符串或路径";////注意:这里的私钥,是从开发者工具->打开文件夹->获取的私钥
            //设置证书相关参数
            CertParams certParams = new CertParams
            {
                AlipayPublicCertPath = path + "appCertPublicKey_2016101900724029.crt", //支付宝公钥证书储存本地路径
                AppCertPath = path + "alipayCertPublicKey_RSA2.crt", //商户证书储存本地路径
                RootCertPath = path + "alipayRootCert.crt", //支付宝根证书储存本地路径
            };
            IAopClient client = new DefaultAopClient(
                "https://openapi.alipaydev.com/gateway.do",//支付宝网关,我这里是沙箱环境,正式环境请去除 dev
                "2016101900724029",// APPID
                APP_PRIVATE_KEY, //秘钥 ,我这里是给的密文,如果给路径下面的 keyFromFile 传入 true
                "json",//请求格式
                "1.0",//版本
                "RSA2",//校验加密方式 如果提是RSA则这里填写RSA
                "utf-8", //请求报文的内容字符集格式
                false,//这里需要注意,如果设置为true 则 APP_PRIVATE_KEY 应为 私钥的物理路径  false 则应为 密文字符串
                certParams);
            //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称如:alipay.open.public.template.message.industry.modify
            AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
            AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();//创建订单的实体类
            model.Body = "我是测试数据";//支付内容
            model.Subject = "App支付测试DoNet"; //支付标题
            model.TotalAmount = "0.01";//价格
            model.ProductCode = "QUICK_MSECURITY_PAY";//这里是请求的方式,参看支付宝文档
            model.OutTradeNo = "202002023test";//平台订单号
            model.TimeoutExpress = "30m";//支付超时时间
            request.SetBizModel(model);
            AlipayTradeAppPayResponse response = client.SdkExecute(request);
            //调用成功,则处理业务逻辑
            if (response.IsError)
            {
                //
                Console.WriteLine(response.Msg);
            }
            Console.WriteLine(HttpUtility.HtmlEncode(response.Body));//这里返回的内容,就是支付宝APP拉起支付需要用到的字符串
            Console.ReadKey();

正常则返回一串APP支付需要用到的内容;

OVER ;

原文地址:https://www.cnblogs.com/fubing/p/12144483.html

时间: 2024-10-16 01:03:42

支付宝 APP支付(证书)方式遇到的问题和解决办法的相关文章

支付宝app支付java后台流程及原理分析

java版支付宝app支付流程及原理分析 本实例是基于springmvc框架编写     一.流程步骤         1.执行流程           当手机端app(就是你公司开发的app)在支付页面时,调起服务端(后台第1个创建订单接口)接口,后台把需要调起支付宝支付的参数返回给手机端,手机端拿到         这些参数后,拉起支付宝支付环境完成支付,完成支付后会调异步通知(第2个接口),此时需要给支付宝返回成功或者失败信息,成功后会调用同步通知(第3个接口)         返回支付成

.Net后台实现支付宝APP支付

前面讨论了微信支付,接下来聊聊支付宝的APP支付(新款支付宝支付).其实这些支付原理都一样,只不过具体到每个支付平台,所使用的支付配置参数不同,返回至支付端的下单参数也不同. 话不多说,直接上代码. 在App.Pay项目中使用NuGet管理器添加引用Alipay.AopSdk,也可以不添加引用,将官方SDK源码放至项目中. 添加完引用后,我们就可以开工了,新建文件夹AliPay,在文件夹中新建AliPayConfig类,存放支付宝APP支付所需的参数,同样,这些参数我也放在了配置文件中. 1 u

关于支付宝app支付服务端的实现-Java版

前言 最近在工作中需要使用支付宝app支付,在初次使用过程中也不可避免的出现了一些问题,那么本次随笔主要是概述支付宝app支付服务端的整个实现过程以及就服务端出现的一些问题做一些总结. 1.准备工作 1.1 入驻蚂蚁金服开放平台 https://open.alipay.com/platform/home.htm 1.2 创建应用 首先需要创建一个应用. 然后需要设置应用公钥. 下载支付宝密钥生成器.生成成功之后将公钥复制到这里. 最后提交审核,等待. 2.Maven依赖 首先需要下载SDK,ht

支付宝APP支付开发- IOException : DerInputStream.getLength(): lengthTag=127, too big.

支付宝APP支付Java开发报错: 1 IOException : DerInputStream.getLength(): lengthTag=127, too big. 后来排查是因为没有设置私钥.

支付宝APP支付开发- IOException : DER input, Integer tag error

支付宝APP支付Java开发报错: 1 java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : DER input, Integer tag error 后来发现,原来是支付宝,生成的命令有问题,参数放错位置 将(3) 的命令改为: openssl pkcs8 -topk8 -nocrypt -inform PEM -in rsa_private_key.pem -o

支付宝APP支付里设置应用网关和授权回调地址是不必填的

支付宝APP支付里设置应用网关和授权回调地址位置为: 支付宝app支付应用网关和授权回调地址为非必填,详细解释链接:https://openclub.alipay.com/read.php?tid=1339&fid=2

ios替换app启动图片时系统报错的解决办法

ios替换app启动图片时系统报错的解决办法:我个人建议是在开发时候经常行的保存项目,并且在修改项目图标图片.app启动图片前,一定要先备份一份没有添加这两项图片的项目. 如果您的项目已经开发完成了,进入到发布前添加项目图标.app启动图片的时候,一定要确定了这两项的所有图片不会更改了再去添加,否则更改已经添加好的加项目图标.app启动图片就会报错, 如果您报错了,百度之后也没有解决办法,那么就尝试在已经备份的项目中重新去添加图片就可以了.

【移动支付】.NET支付宝App支付接入

一.前言        最近也是为了新产品忙得起飞,博客都更新的慢了.新产品为了方便用户支付,需要支付宝扫码接入.这活落到了我的身上.产品是Windows系统下的桌面软件,通过软件生成二维码支付.界面以原生的MVVM编写,下面叙述一下基本的过程,做过的老司机可以直接点关闭了. 二.申请接口         申请接口是第一步,首先有这么几件事: 公司具有支付宝账户 公司具有营业资质(废话) 创建应用,签约电脑网站支付,手机支付,App支付. 创建私钥.公钥.支付宝公钥 配置网关及回调地址 需要注意

支付宝app支付服务器签名代码(C#)

1,引入支付宝的sdk(AopSdk) 支付宝接口文档网站可下载,注意下载C#版本: 2,代码写的比较简单 public static string RSASign(string OrderNo,decimal Money,string bodyp,string subjectp) { string publicKeyPem = ;//支付宝公钥  string privateKeyPem = ;//商户私钥 string out_trade_no = OrderNo;//订单号 double