支付宝 App 支付踩坑记:x509 证书不匹配 & 应用未上线问题解决

0 阅读3分钟

概述

接入支付宝 App 支付时,你是否遇到过 x509: inner and outer signature algorithm identifiers don‘t match 或 isv.not-online-app 错误?本文基于真实排障经历,分析两个典型问题:一是因加密类型(证书模式与普通模式)混用导致的证书签名算法不匹配;二是应用未提交审核直接调起支付返回 40003。帮你快速定位并解决这些“隐形坑”。

商户/应用申请

支付宝商户支付需要的流程步骤:

1、在支付宝开通商户商家平台申请、开通认证商户 https://b.alipay.com/page/portal/home

2、在支付宝开放平台申请应用,用户是通用的,一定要注意登录次数,是有次数限制的 https://open.alipay.com/

3、下载支付宝开放平台密钥工具,如下如:

1.png

加密方式

加密方式一共有两种:密钥模式证书模式,支付宝开放平台,RSA2、SM2 都分「普通公钥模式」和「公钥证书模式」,核心差异是安全等级、抗抵赖能力。

  • 密钥模式:直接用「公钥、私钥字符串」验签,无第三方认证,简单但安全弱。
  • 证书模式:用带 CA 签名的数字证书验签,支付宝官方核验证书身份,防篡改、防冒充、可吊销,安全等级高

1. 普通密钥模式(最简单)

  • 生成:自己生成一对应用私钥、应用公钥,上传应用公钥到支付宝,下载支付宝公钥。
  • 原理:纯密钥校验,无第三方 CA 机构背书。
  • 特点:配置简单、对接快;私钥泄露风险高,无身份背书,中小商户、测试环境常用。

2. 证书模式(更安全,推荐生产)

  • 生成:申请X.509 格式数字证书(RSA2 证书 / SM2 国密证书),上传证书 + 证书私钥。
  • 原理:引入 CA 机构认证身份,证书带有效期,可吊销,支持抗抵赖、防篡改、身份核验
  • 特点:安全性极高,满足金融级安全;配置复杂,需维护证书有效期;RSA2、SM2 都支持证书模式

加密算法

  • RSA2(SHA256withRSA) :国际通用非对称算法,支付宝默认主流方案, 密钥固定 2048 位 RSA,搭配 SHA256 哈希签名,基于**大整数分解难题。
  • SM2:国家商用密码算法(国密),椭圆曲线 ECC 算法,密钥仅 256 位,基于椭圆曲线离散对数难题,国内金融、政务强制合规场景优先。

设置密钥

在支付宝开放平台设置密钥Key,根据你接入的类型设置,把每一个证书下载到本地,在SDK调起的地方使用,我的是证书类型,证书类型稍微复杂一点:

2.png

在实际的接入中,遇到了2个问题:

问题一:登录到支付宝开放平台应用->开发设置里可以设置,需要注意的是加密类型,如果类型不一致,支付宝不能成功调起,比如我之前用的是证书,然后配置的不对,产生错误信息x509: inner and outer signature algorithm identifiers don't match 配置正确就能被成功调用。

问题二:再接入SDK的时候,支付宝返回错误信息,这是因为应用还未上线,提交审核。

{resultStatus: 4000, result: {
        "alipay_trade_app_pay_response": {
            "code": "40003",
            "msg": "Insufficient Conditions",
            "sub_code": "isv.not-online-app",
            "sub_msg": "应用未上线"
        }
    }, memo:
}

代码实现

代码包使用的是官方集成包github.com/smartwalle/alipay/v3,把主要结构体和方法写在下面了,只要能实例化没有提示公钥错误,说明密钥已经被正确创建了,把包集成到自己的业务里就可以了。

package pay

import (
  "github.com/smartwalle/alipay/v3"
)

type AliPay struct {
  ctx              context.Context
  svcCtx           *svc.ServiceContext
  AppId            string
  IsProd           bool
  SignType         string
  ReturnUrl        string
  NotifyUrl        string
  RefundNotifyUrl  string
  PrivateKey       string
  AppPublicCert    string // 应用公钥
  AlipayRootCert   string // 支付宝根证书
  AlipayPublicCert string // 支付宝公钥
  client           *alipay.Client
}