支付宝获取 APPID
简介
APPID 相当于应用的身份证号,是支付宝分配给开发者的应用 ID,只有应用创建后才可以获取。
获取
请登录 支付宝开放平台 找到对应应用,名称下数字串即为 APPID,后续可用于 OpenAPI 调用等操作。

支付宝获取 APPID
APPID 相当于应用的身份证号,是支付宝分配给开发者的应用 ID,只有应用创建后才可以获取。
请登录 支付宝开放平台 找到对应应用,名称下数字串即为 APPID,后续可用于 OpenAPI 调用等操作。
支付宝获取 PID
PID(合作者身份 ID)是商家与支付宝签约后,商家获得的支付宝商家唯一识别码。
由于身份不同获取方式不同,以下分别介绍商家获取自己与服务商获取商家 PID 的方式。
服务商获取商家的 PID,需要使用 获取会员信息,调用 alipay.system.oauth.token(换取授权访问令牌) 接口。
支付宝pageExecute() 方法如何生成 url 链接?
网站类的接口(例如手机网站支付、电脑网站支付)接口的请求使用 pageExecute() 方式进行请求默认为 POST 方式请求,即生成 form 表单,GET 方式请求生成 url 链接。
注意:
不同语言请求方式不同,如下:
//post方式请求,生成form表单 response= alipayClient.pageExecute(alipayRequest).getBody(); //get方式请求,即生成url链接 response = alipayClient.pageExecute(alipayRequest,"GET").getBody();
//post方式请求,生成form表单 $result = $aop->pageExecute($reques); //get方式请求,即生成url链接 $result = $aop->pageExecute($request,"GET");
//post方式请求,生成form表单 response= client.pageExecute(request); //get方式请求,即生成url链接 response = client.pageExecute(request,"", "GET");
//post方式请求,生成form表单 response = client.page_execute(request) //get方式请求,即生成url链接 response = client.page_execute(request,http_method="GET")
//post方式请求,生成form表单(无需设置调用setMethod)
const formData = new AlipayFormData();
//get方式请求,即生成url链接(需调用setMethod并传入get)
const formData = new AlipayFormData();
formData.setMethod('get');
支付宝服务端如何接收通知及验签?
以支付接口接收通知并处理为例。
Java 异步验签示例
//获取支付宝POST过来反馈信息
Map< String , String > params = new HashMap < String , String > ();
Map requestParams = request.getParameterMap();
for(Iterator iter = requestParams.keySet().iterator();iter.hasNext();){
String name = (String)iter.next();
String[] values = (String [])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);
}
//切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
//boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
boolean flag = AlipaySignature.rsaCheckV1 (params,alipaypublicKey, "UTF-8","RSA2");
Java异步验签示例(证书)
//获取支付宝POST过来反馈信息
Map<String,String> params = new HashMap<String,String>();
Map requestParams = request.getParameterMap();
for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext ();) {
String name = ( String )iter.next();
String[] values = (String[])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);
}
//切记alipayPublicCertPath是支付宝公钥证书路径,请去open.alipay.com对应应用下载。
//boolean AlipaySignature.rsaCertCheckV1(Map<String, String> params, String publicKeyCertPath, String charset,String signType)
boolean flag = AlipaySignature.rsaCertCheckV1(params,alipayPublicCertPath,"UTF-8","RSA2");
PHP异步验签示例
php语言公钥与公钥证书验签方法相同。 $aop = new AopClient; $aop->alipayrsaPublicKey = '请填写支付宝公钥/支付宝公钥证书路径'; $flag = $aop->rsaCheckV1($_POST, NULL, "RSA2");
C#异步验签示例
验签方法中 keyFromFile 必传 false,否则验签失败。
// 获 取 支 付 宝 POST 过 来 通 知 消 息 , 并 以 “参 数 名 = 参 数 值 ” 的 形 式 组 成 数 组
// request 回 来 的 信 息 组 成 的 数 组
public Dictionary<string,string> GetRequestPost()
{
int i = 0 ;
IDictionary<string,string> sArray = new IDictionary<string,string>();
NameValueCollection coll;
// Load Form variables into NameValueCollection variable .
coll = Request.Form ;
//Get names of all forms into a string array .
String[] requestItem = coll.AllKeys;
for (i = 0;i < requestItem.Length ; i++)
{
sArray.Add( requestItem[i], Request.Form[requestItem[i]]);
}
return sArray ;
}
// 切 记 alipaypublickey 是 支 付 宝 的 公 钥 , 请 去 open .alipay .com 对 应 应 用 下 查 看 。
// bool RSACheckV1 ( IDictionary < string , string > parameters , string alipaypublicKey , string charset , string signType , bool keyFromFile )
bool flag = AlipaySignature.RSACheckV1(GetRequestPost(),alipaypublicKey,"UTF-8","RSA2",false);
C#异步验签示例(证书)
// 获 取 支 付 宝 POST 过 来 通 知 消 息 , 并 以 “参 数 名 = 参 数 值 ” 的 形 式 组 成 数 组
// request 回 来 的 信 息 组 成 的 数 组
public Dictionary<string,string> GetRequestPost()
{
int i = 0 ;
IDictionary<string,string> sArray = new IDictionary<string,string>();
NameValueCollection coll;
// Load Form variables into NameValueCollection variable .
coll = Request.Form ;
//Get names of all forms into a string array .
String[] requestItem = coll.AllKeys;
for (i = 0;i < requestItem.Length ; i++)
{
sArray.Add( requestItem[i], Request.Form[requestItem[i]]);
}
return sArray ;
}
// 切 记 alipayPublicCertPath 是 支付宝公钥证书路径 , 请 去 open .alipay .com 对 应 应 用 下 查 看 。
// bool RSACheckV1 ( IDictionary < string , string > parameters , string alipayPublicCertPath , string charset , string signType)
bool flag = AlipaySignature.RSACertCheckV1(dics, alipayPublicCertPath, "UTF-8", "RSA2");
支付宝当前开放平台支持哪些权威 CA 签发的证书?
当前开放平台支持根 CA 列表:
| 机构名称 | 电子认证服务机构简称 | 证书主题名称 | 密钥算法 | 证书生效时间(GMT) | 证书失效时间(GMT) |
| 浙江蚂蚁小微金融服务集团股份有限公司 | 蚂蚁CA | Ant Financial Certification Authority R1 | RSA4096 | 2018/3/21 13:48 | 2038/2/28 13:48 |
| 中金金融认证中心有限公司 | CFCA | CFCA ACS CA | RSA4096 | 2015/9/23 3:24 | 2035/9/28 3:24 |
| 北京天威诚信电子商务服务有限公司 | 天威诚信 | iTrusChina Class 3 Root CA – G3 | RSA2048 | 2013/4/18 9:36 | 2033/4/18 9:36 |
| 北京天威诚信电子商务服务有限公司 | 天威诚信 | iTrusChina Class 2 Root CA – G3 | RSA2048 | 2013/4/18 9:39 | 2033/4/18 9:39 |
| 国家根 | ROOTCA | ROOTCA | SM2 | 2012/7/14 3:11 | 2042/7/7 3:11 |
使用公钥证书签名方式下,为什么请求参数中必须设置支付宝根证书 SN(alipay_root_cert_sn)?
对动态下载的支付宝公钥证执行的证书校验过程中需要使用到支付宝根证书。但公钥证书的变更有可能是由于根证书的变更导致,若根证书未更新,则会引起公钥证书更新失败,导致商家验签失败。为降低该风险,支付宝开放平台强制要求证书签名模式的商家同时携带当前使用的支付宝根证书 SN,开放平台可基于该根证书 SN 统计未及时更新支付宝根证书的商家。
支付宝使用公钥证书签名方式下,为什么开放平台网关的响应报文需要携带支付宝公钥证书 SN(alipay_cert_sn)?
开发者上传自己的应用公钥证书后,开放平台会为开发者应用自动签发支付宝公钥证书供开发者下载,用来对开放平台网关响应报文做验签。
但是支付宝公钥证书可能因证书到期或者变更 CA 签发机构等原因,可能会重新签发证书。在重新签发前,开放平台会在门户上提前提醒开发者支付宝应用公钥证书变更时间。
但为避免开发者因未能及时感知支付宝公钥证书变更而导致验签失败,开放平台提供了一种支付宝公钥证书无感知升级机制,具体流程如下:
支付宝使用公钥证书签名方式下,为什么请求参数中必须应用公钥证书 SN(app_cert_sn)?
当前开放平台支持两种签名模式:公钥模式、公钥证书模式,开放平台网关会根据请求参数中是否存在应用公钥证书 SN(app_cert_sn)来判断当前请求是使用公钥模式还是公钥证书模式。
若开发者选择了公钥证书签名模式,上传了应用公钥证书,并使用该公钥对应的私钥加签,但请求参数中未携带应用公钥证书 SN。开放平台网关收到请求后,会认为该请求使用公钥签名模式,将导致网关验签失败。
另外,开发者也一定要确保自己用来加签的私钥、请求参数中应用公钥证书 SN 的值、上传到开放平台的应用公钥证书必须是匹配的,否则网关会验签失败。
使用公钥证书签名方式下, 请求参数中需要携带应用公钥证书 SN(app_cert_sn)、支付宝根证书 SN(alipay_root_cert_sn),这里的 SN 是指什么?
这里的 SN 是指基于开放平台提供的计算规则,动态计算出来的公钥证书序列号,与 X.509 证书中内置的序列号(serialNumber)不同。具体的计算规则如下:
/**
* 获取证书序列号
* @param certPath X.509证书文件路径
* @return 返回证书序列号
* @throws AlipayApiException
*/
public static String getCertSN ( String certPath )
说明:开放平台支持开发者上传自己找第三方权威 CA 签发的证书,而证书文件中内置序列号只能保证同一家签发机构签发的证书不重复。所以不支持直接使用证书文件中内置的序列号。
老应用公钥证书如何更换成新公钥证书?、
开发者登录开放平台,在应用 加签方式 设置页面,选择 公钥证书 方式,再在该页面中通过 上传 CSR 文件在线生成证书 或 上传已申请证书 两种方式设置应用新应用公钥证书。详情可查看 开放平台证书升级指南。
注意:
上传新应用公钥证书后,开放平台将为老应用公钥证书保留 7 天有效期(若在这 7 天内老证书到期,以老证书自身过期时间点为准),超过 7 天后老证书将不可用。开发者务必在更新证书后 7 天时间内,更换接入开放平台网关代码中的应用公钥证书,否则 7 天后开放平台网关将验签失败。
原使用公钥签名方式的应用如何升级公钥证书签名方式?
开发者登录开放平台,在应用 加签方式 设置页面,选择 公钥证书 方式,再在该页面中通过 上传 CSR 文件在线生成证书 或 上传已申请证书 两种方式设置应用的公钥证书。详情可查看 开放平台证书升级指南。
注意:对于从 公钥 变更到 公钥证书 签名方式的应用,在变更 7 日内允许开发者撤销证书回退到 公钥 模式;变更一周后不允许再回退到原模式。开发者调用支付宝网关的代码也需要升级,否则变更 7 日后原来的 公钥 模式接入会被支付宝网关拦截而无法成功调用。
开放平台支持的公钥、公钥证书两种签名方式有什么区别?
在报文签名场景下,报文接受方使用发送方的公钥进行报文验签,该功能两种签名方式都可以实现。而证书签名方式的优势在于引入了 CA 机构对公钥持有者进行身份识别,保证该证书所属实体的真实性,以实现报文的抗抵赖。
支付宝开放平台 OpenAPI 网关接口和支付宝 mapi 网关接口签名处理上有何区别?
开放平台接口网关地址是 open.alipay.com,mapi 网关地址是 mapi.alipay.com。
签名专区描述的内容是针对 OpenAPI 网关接口的签名和验签方法。如果是 mapi 网关接口,签名规则有所区别,详情可查看 签名与验签。
和支付宝交换公钥是什么意思?
开发者私钥由开发者自行保管,把对应公钥提供给支付宝。相应的,支付宝提供自己的公钥给开发者,这称为交换公钥。
开发者使用开发者私钥对请求内容签名,支付宝收到请求后,会使用开发者公钥进行验签,验签通过证明信息来源可靠并且未篡改。
支付宝发送给开发者的数据中,支付宝也会使用自己的私钥进行签名。商家收到后,使用支付宝公钥验签,验签通过证明是支付宝发送的消息,并且未篡改。
支付宝什么是 RSA 算法?
RSA 签名算法是一种非对称算法,RSA 密钥包括公钥和私钥两部分,公钥是公开信息,私钥是保密信息。在开放平台,开发者的私钥由开发者自己保存;开发者的公钥可对外公开。私钥用于签名,公钥用于验签。开发者保存自己的私钥,并对发给支付宝的信息进行签名,支付宝通过使用开发者的公钥进行验签;(支付宝端类似),通过这种方式保证信息传输的完整性以及发送者身份的真实性。
支付宝RSA 签名涉及到的商家角色有哪些?
RSA 签名涉及到的商家角色分为支付宝账号管理者和技术人员,分别执行如下操作: