Alipay SDK
蚂蚁金服开放平台 SDK
第一次使用,请参考支付宝开放平台配置设置公钥
SDK 使用文档
1. 实例化 SDK
// TypeScript
import AlipaySdk from 'alipay-sdk';
const alipaySdk = new AlipaySdk(AlipaySdkConfig);
AlipaySdkConfig
配置项
- 必选
appId
: String
开放平台上创建应用时生成的 appIdprivateKey
: String
应用私钥alipayPublicKey
: String
支付宝公钥
- 可选
timeout
: Number
网关超时时间,单位毫秒,默认 5000
camelcase
: Boolean
是否把服务端返回的数据中的字段名从下划线转为驼峰,默认 true
完整的例子:
// TypeScript
import AlipaySdk from 'alipay-sdk';
const alipaySdk = new AlipaySdk({
appId: '2016123456789012',
privateKey: fs.readFileSync('./private-key.pem', 'ascii'),
alipayPublicKey: fs.readFileSync('./public-key.pem', 'ascii'),
});
2. 通过 exec
调用 API
// TypeScript
try {
const result = await alipaySdk.exec(method, params, options);
// console.log(result);
} catch (err) {
// ...
}
-
exec 参数列表
- 必选
method
: String
调用的 Api,比如 alipay.system.oauth.token
- 可选
params
: Object
Api 的请求参数(包含部分“公共请求参数”和“请求参数”)
bizContent
: Object
可选项
- 注意: 仅当 Api 文档的“公共请求参数”列表中存在
biz_content
时,才需要通过 bizContent
设置请求参数,否则应该通过 params
传递请求参数
options
: Object
可选项
validateSign
: Boolean
是否对返回值验签(依赖实例化时配置的”支付宝公钥“),默认 false
formData
: Object
文件上传类接口的请求参数,,默认 null
log
: Log 对象,存在时会调用 info
、error
方法写日志,默认 null
即不写日志
-
exec 返回值类型: Promise
完整的例子
// TypeScript
try {
const result = await alipaySdk.exec('alipay.system.oauth.token', {
// alipay.system.oauth.token 的 “公共请求参数” 中不包含 biz_content 字段,因此通过 params 设置参数
grantType: 'authorization_code',
code: 'code',
refreshToken: 'token'
}, {
// 验签
validateSign: true,
// 打印执行日志
log: this.logger,
});
// result 为 API 介绍内容中 “响应参数” 对应的结果
console.log(result);
} catch (err) {
//...
}
其他
文件上传类接口调用
// 引入 AlipayFormData 并实例化
import AlipayFormData from 'alipay-sdk/lib/form';
const formData = new AlipayFormData();
AlipayFormData 提供了下面 2 个方法,用于增加字段文件:
-
addField(fieldName, fieldValue)
增加字段,包含 2 个参数
fieldName
: String
字段名fieldValue
: String
字段值
-
addFile(fieldName, fileName, filePath)
增加文件,包含 3 个参数
fieldName
: String
字段名fileName
: String
文件名filePath
: String
文件绝对路径
完整的例子
// TypeScript
import AlipayFormData from 'alipay-sdk/lib/form';
const formData = new AlipayFormData();
// 增加字段
formData.addField('imageType', 'jpg');
formData.addField('imageName', '图片.jpg');
// 增加上传的文件
formData.addFile('imageContent', '图片.jpg', path.join(__dirname, './test.jpg'));
try {
const result = alipaySdk.exec(
'alipay.offline.material.image.upload',
// 文件上传类接口 params 需要设置为 {}
{},
{
// 通过 formData 设置请求参数
formData: formData,
validateSign: true,
},
);
/**
* result 为 API 介绍内容中 “响应参数” 对应的结果
* 调用成功的情况下,返回值内容如下:
* {
* "code":"10000",
* "msg":"Success",
* "imageId":"4vjkXpGkRhKRH78ylDPJ4QAAACMAAQED",
* "imageUrl":"http://oalipay-dl-django.alicdn.com/rest/1.0/image?fileIds=4vjkXpGkRhKRH78ylDPJ4QAAACMAAQED&zoom=original"
* }
*/
console.log(result);
} catch (err) {
//...
}
页面类接口调用
页面类接口默认返回的数据为 html 代码片段,比如 PC 支付接口 alipay.trade.page.pay
返回的内容为 Form 表单。
同文件上传,此类接口也需要通过 AlipayFormData.addField
来增加参数。此外,AlipayFormData 还提供了 setMethod
方法,用于直接返回 url:
setMethod(method)
设置请求方法
method
: 'post' | 'get'
默认为 post
完整的例子
返回 form 表单
// TypeScript
import AlipayFormData from 'alipay-sdk/lib/form';
const formData = new AlipayFormData();
formData.addField('notifyUrl', 'http://www.com/notify');
formData.addField('bizContent', {
out_trade_no: 'out_trade_no',
product_code: 'FAST_INSTANT_TRADE_PAY',
totalAmount: '0.01',
subject: '商品',
body: '商品详情',
});
try {
const result = alipaySdk.exec(
'alipay.offline.material.image.upload', {}, {
formData: formData,
},
);
// result 为 form 表单
console.log(result);
} catch (err) {}
返回支付链接
// TypeScript
import AlipayFormData from 'alipay-sdk/lib/form';
const formData = new AlipayFormData();
// 调用 setMethod 并传入 get,会返回可以跳转到支付页面的 url
formData.setMethod('get');
formData.addField('notifyUrl', 'http://www.com/notify');
formData.addField('bizContent', {
out_trade_no: 'out_trade_no',
product_code: 'FAST_INSTANT_TRADE_PAY',
totalAmount: '0.01',
subject: '支付测试',
body: '支付测试',
});
try {
const result = alipaySdk.exec(
'alipay.offline.material.image.upload', {}, {
formData: formData,
},
);
// result 为可以跳转到支付链接的 url
console.log(result);
} catch (err) {}
支付宝开放平台配置
1. 注册支付宝开放平台账号
支付宝开放平台: https://open.alipay.com/
2. 生成密钥
-
下载 RSA密钥工具:https://docs.open.alipay.com/291/106097/
-
切换到生成秘钥 tab,秘钥格式选择“PKCS1(非JAVA适用)”
不需要手动修改秘钥格式,SDK 会自动处理
-
新建 private-key.pem 保存私钥,文件格式如下:
// 粘贴上一步生成的私钥到这里(不需要换行)
完整的 private-key.pem 文件例子:
MIIEpQIBAAKCAQEAqATL9/w/B5Siq/C0mKO8CoUqxX9gv2Fxs2Xz8n0Ce2O3qk+zzQxxwpgG77TMQ5JRaFZ8f1hA2Ax8DQVp9NLi5hqX3cZUpt8snWvc2Jz3hNWv81GqTDZCsMQD/HqgLURZxyw1yVHA2sayFcm8Exn1gqd1bNMSdy/VxhtfwKRxBq/vTNtfKus2E15/bQKB+l/mvroYrR5qYOAInEQt0HoTDFKL2+kvq3TD24gT/VbsfpJoy8FU3lT33LkYAOhHridveugXLbd7eK9e4iC02KV1loQBbL7R+UKdvh+5RZQfRIbQfKhDaSwQqTY0l+2u0b7W80BV8M1iMwQ8errtyUuWKQIDAQABAoIBAEcB5/XA7B5XCbyiuKA9qm3Dw8S9xXR8SSIpN0TG4jKlfOyETJee58D2oQ/TF/SCtNbkni7vbFAiTpbuL85hBbV7ja0TcZkofmF1QVtmUxEXggnR/KfC0sKDxK+CX4lh9pM/MugHHfsXuBGPNWXZNbHm9bBtL8OhOrZDwV7X4FCTgKw8qPBX+hO+RuUQ8iDfZMgUWkrSPCAT68XdLU4K9RrPYMHSmE9HgQhkNbtbLpbHgXxL81H9mIwA4DL3FMoh0IwJ+Yx12m1xC6mVQay2e2DRWfOiGFJWgE2EM1+KY1SR2WgsjNM2/Q1QmSijHbTOx2/gW7xbsuazNQRoptoFVIECgYEA1cslOJmWXa3BVTaV/o47bSSYEjwfg/bV9gDkqA9+33oxLvWehaOYjwsLmY9uid95sWD0mQtJj4pXr63e5SBnTd3vB2p5fJ2Cnt9vnpq/nHvnB0xPHB/DhAMCMYm1bV6gKSzimG1DJVsygjWrbz1lEQ0GMJSBidC0mLx2Jl+jCvECgYEAyTBAPzMvKt1OUTbg1UwqoktKOBCWbaTVNst22/NtLIxi0zAl80NgdbNLhH+zesFGnTmFnP/79SshntvbPNAlUOkL1BPPAhHoIUR7ubFxDeDGFQ+DIUtHKBzYSvbekRO1AEPNkhFA3NiYnRrDOGYC+utuyafCppuBSSXpgMzXjrkCgYEAxaEiaS3hB/vk6gappUSJvpzDTqfxYiW9J8kvlgOs/pyP9p7qyRKvphtJv8wNHLpOXiAIO6lpeJ0j7axGjXvkwuBTY4GTiBR6eK6HGhBm7BrFN8PcpVzfeZrmXjC0W8PLPgTV+p2WImQpTqCaNxyD3r0xaZr+HA2nxEEC3votV6ECgYEAnyQLrfJO3RkxWgyOzCnzj2z+yFpWo2Q/Q5it7E4hjZt+kI8FdedV5cRtd+GLlw5LTRKzHf1e0A/OCFrgkLoUymuNb7Q7iuefNrF1LO2u/8tM5Fvg3fUt1Az9Ck88voVYJ116vo/nPsoV7i+9PF90/AY/HEQXNLLNEY9rpPZjjAECgYEAk9RSfc1w5TJbW8EqqSJ+tgyfJ8zP/D9pnZ0zmXeryVwne7YQmOar6KlLGNBKxbMSF6JV+Yo0lPKKdDmeH8Iqbo6l2grDGyeNLOlTug3fgdtFfgvBzJmQNXd8qpR8smzPqbcYwYHZG39l7lZ+lx/h1+qDiEcMRu/r8h3gv04lMxA=
3. 设置应用公钥
-
复制 2.2 中生成的应用公钥
-
登录开放平台设置应用公钥
4. 保存支付宝公钥
“支付宝公钥”用于开放平台返回值的进行验签
-
开放平台“应用概览”页面中复制“支付宝公钥”
-
新建 public-key.pem 保存私钥,文件格式如下:
// 粘贴上一步复制的“支付宝公钥”到这里(不需要换行)
完整的 public-key.pem 文件例子:
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqATL9/w/B5Siq/C0mKO8CoUqxX9gv2Fxs2Xz8n0Ce2O3qk+zzQxxwpgG77TMQ5JRaFZ8f1hA2Ax8DQVp9NLi5hqX3cZUpt8snWvc2Jz3hNWv81GqTDZCsMQD/HqgLURZxyw1yVHA2sayFcm8Exn1gqd1bNMSdy/VxhtfwKRxBq/vTNtfKus2E15/bQKB+l/mvroYrR5qYOAInEQt0HoTDFKL2+kvq3TD24gT/VbsfpJoy8FU3lT33LkYAOhHridveugXLbd7eK9e4iC02KV1loQBbL7R+UKdvh+5RZQfRIbQfKhDaSwQqTY0l+2u0b7W80BV8M1iMwQ8errtyUuWKQIDAQAB