iphone开发 支付宝 报错 rsa_private read error : private key is NULL解决方法

原因

真机调试IOS支付宝功能GDB出现 rsa_private read error : private key is NULL提示

调试iOS 支付宝SDK的时候,运行demo,把
Partner(合作商户 ID)
Seller(账户 ID)
RSA public key(支付宝公钥)
RSA private key(商户私钥)

都放到plist文件了,运行的时候,报错 rsa_private read error : private key isNULL

我确定的是RSA private key肯定是有的,调试了下

    bio_private= BIO_new(BIO_s_file());
    BIO_read_filename(bio_private,private_key_file_path);
    rsa_private= PEM_read_bio_RSAPrivateKey(bio_private, NULL, NULL,"");    
    if(rsa_private != nil) {
这里,rsa_private 返回空, private_key_file_path 这些值都是有的

解决方法

将私钥转成PKCS8替换一下原私钥即可


1、生成私钥pem,  执行命令openssl genrsa -out rsa_private_key.pem 1024

2、生成公钥,执行命令openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

3RSA私钥转换成PKCS8格式,命令执行openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt PHP服务端语言读取私钥不需要PKCS8转换。



package cn.neuedu.mall.springbootvue.common.util; import cn.neuedu.mall.springbootvue.common.config.AlipayConfig; import cn.neuedu.mall.springbootvue.model.PayModel; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.internal.util.AlipaySignature; import com.alipay.api.request.AlipayTradePagePayRequest; import com.alipay.api.request.AlipayTradeQueryRequest; import com.alipay.api.response.AlipayTradeQueryResponse; import javax.servlet.http.HttpServletRequest; import java.util.HashMap; import java.util.Map; public class PayUtil { public static AlipayClient alipayClient; // 静态初始化块,设置超时参数 static { alipayClient = new DefaultAlipayClient( AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type ); // 设置超时时间(毫秒) ((DefaultAlipayClient) alipayClient).setConnectTimeout(20000); // 连接超时20秒 ((DefaultAlipayClient) alipayClient).setReadTimeout(60000); // 读取超时60秒 } /** * 验证支付回调是否来自支付宝,并解析订单信息 */ public static PayModel paySuccess(HttpServletRequest request) throws Exception { PayModel model = new PayModel(); // 获取支付宝回调的所有参数 Map<String, String> params = new HashMap<>(); Map<String, String[]> requestParams = request.getParameterMap(); for (String name : requestParams.keySet()) { String[] values = requestParams.get(name); String valueStr = ""; for (int i = 0; i < values.length; i++) { valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ","; } // 解决中文乱码问题 valueStr = new String(valueStr.getBytes("ISO-8859-1"), "UTF-8"); params.put(name, valueStr); } // 验证签名 boolean signVerified = AlipaySignature.rsaCheckV1( params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type ); if (signVerified) { // 签名验证通过,获取订单信息 String out_trade_no = params.get("out_trade_no"); // 商户订单号 String trade_no = params.get("trade_no"); // 支付宝交易号 String total_amount = params.get("total_amount"); // 付款金额 System.out.println("支付成功: 订单号=" + out_trade_no + ", 交易号=" + trade_no + ", 金额=" + total_amount); model.setSuccess(1); model.setTarget(out_trade_no); // 返回订单号 model.setPayUrl(trade_no); // 存储交易号 } else { model.setSuccess(0); model.setError("签名验证失败,非法请求"); } return model; } /** * 支付宝支付 */ public static PayModel pay(String out_trade_no, String total_amount, String subject, String body) { PayModel payModel = new PayModel(); // 设置请求参数 AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest(); alipayRequest.setReturnUrl(AlipayConfig.return_url); alipayRequest.setNotifyUrl(AlipayConfig.notify_url); alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\"," + "\"total_amount\":\"" + total_amount + "\"," + "\"subject\":\"" + subject + "\"," + "\"body\":\"" + body + "\"," + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}"); try { // 生成支付宝支付表单HTML String result = alipayClient.pageExecute(alipayRequest).getBody(); payModel.setSuccess(1); payModel.setPayUrl(result); // 将支付链接设置到PayUrl字段 return payModel; } catch (AlipayApiException e) { e.printStackTrace(); payModel.setSuccess(0); payModel.setError("生成支付链接失败: " + e.getMessage()); return payModel; } } /** * 查询订单是否付款成功 * @param out_trade_no 商户订单号 */ public static PayModel payQuery(String out_trade_no) { PayModel payModel = new PayModel(); int maxRetries = 3; // 最大重试次数 for (int i = 0; i < maxRetries; i++) { AlipayTradeQueryRequest request = new AlipayTradeQueryRequest(); request.setBizContent("{" + "\"out_trade_no\":\"" + out_trade_no + "\"," + "\"trade_no\":\"\"" + " }"); try { // 执行查询请求 AlipayTradeQueryResponse response = alipayClient.execute(request); System.out.println("支付宝查询响应: " + response.getBody()); if (response.isSuccess()) { System.out.println("调用成功"); String tradeStatus = response.getTradeStatus(); // 根据交易状态设置返回结果 if ("TRADE_SUCCESS".equals(tradeStatus) || "TRADE_FINISHED".equals(tradeStatus)) { payModel.setSuccess(1); payModel.setTarget(out_trade_no); payModel.setError("订单已支付"); return payModel; } else if ("WAIT_BUYER_PAY".equals(tradeStatus)) { payModel.setSuccess(0); payModel.setError("等待买家付款"); return payModel; } else if ("TRADE_CLOSED".equals(tradeStatus)) { payModel.setSuccess(0); payModel.setError("交易已关闭"); return payModel; } } else { payModel.setSuccess(0); payModel.setError("查询失败: " + response.getSubMsg()); // 非超时错误,无需重试 return payModel; } } catch (AlipayApiException e) { // 处理超时异常,进行重试 if (e.getMessage().contains("Read timed out")) { System.out.println("查询超时,正在进行第 " + (i + 1) + " 次重试..."); try { Thread.sleep(2000 * (i + 1)); // 指数退避 } catch (InterruptedException ie) { Thread.currentThread().interrupt(); } } else { // 其他异常,直接返回错误 payModel.setSuccess(0); payModel.setError("支付宝API异常: " + e.getMessage()); return payModel; } } } // 达到最大重试次数仍失败 payModel.setSuccess(0); payModel.setError("支付宝查询超时,已达到最大重试次数"); return payModel; } }有问题吗
最新发布
08-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值