支付宝sdk

第一次使用,请先在 设置 > 开发设置 > 接口加签方式 配置生成的公钥在新窗口打开,注意选择其他(PKCS1)

警告

不要公开暴露示例中的密钥(secret)。我们在这里这样做是为了向您明确代码在做什么,但在生产环境中,您必须使用适当的措施来保护此密钥, 例如秘钥库、环境变量或配置服务。

安装

yarn add @zeronejs/alipay-sdk
1
npm install @zeronejs/alipay-sdk
1

配置

在根模块输入AlipayModule

import { AlipayModule } from '@zeronejs/alipay-sdk';

@Module({
    ...
    imports: [
        ...,
        AlipayModule.forRoot({
            appId: 'xxxxxxxxxxx',
            privateKey: fs.readFileSync(join(__dirname, './privateKey.txt'), 'ascii'), //自行配置位置 
        }),
    ],
    ...
})
export class appModule {}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

必填参数

参数类型说明
appIdString开放平台上创建应用时生成的 appId
privateKeyString应用私钥字符串

可选参数

参数类型默认值说明
nameString-实例名称,在你需要配置多个appId时使用
signTypeStringRSA2签名算法,不建议修改
alipayPublicKeyString-支付宝公钥,需要对结果验签时候必填
gatewayStringhttps://openapi.alipay.com/gateway.do支付宝网关地址 ,沙箱环境下使用时需要修改
timeoutNumber5000网关超时时间,单位毫秒
camelcaseBooleantrue是否把网关返回数据中的的下划线 key 转换为驼峰写法

提示

你可以配置多个appId

AlipayModule.forRoot([
    {
        name: 'app1',
        appId: 'xxxxxxxxxxx1',
        privateKey: 'xxxxxxxxxxxxxxxxxx', 
    },
    {
        name: 'app2',
        appId: 'xxxxxxxxxxx2',
        privateKey: 'xxxxxxxxxxxxxxxxxx', 
    }
])
1
2
3
4
5
6
7
8
9
10
11
12

使用

获取alipay实例,并调用sdk提供的方法

import { AlipayService } from '@zeronejs/alipay-sdk';
@Controller()
export class AlipayController {
    constructor(private readonly alipayService: AlipayService) {}
    @Post('demo')
    async demo(@Body() body: any) {
        // 获取 alipay 实例
        const alipay = this.alipayService.getInstance();
        const result = await alipay.exec('alipay.system.oauth.token', {
            grantType: 'authorization_code',
            code: body.code,
        });
        console.log(result);
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

提示

当你配置了多个appId

const alipay = this.alipayService.getInstance('app1');
1

exec(method, params, options)

必填参数

参数类型说明
methodString调用的 Api,比如 alipay.system.oauth.token

可选参数

params
参数类型默认值说明
paramsObject-Api 的请求参数(包含“公共请求参数”和“业务参数”)
请求参数
参数类型默认值说明
bizContentObject-仅当 Api 文档的“公共请求参数”列表中存在 biz_content时,才需要通过 bizContent 设置业务参数,否则应该通过 params 传参,业务参数 Demo无业务参数 Demo
options
参数类型默认值说明
validateSignBooleanfalse是否对返回值验签(依赖配置支付宝公钥
formDataObject-文件上传类接口的请求参数
logObject存在时会调用 info、error 方法写日志

checkNotifySign(postData)

通知验签

参数

参数类型说明
postDataObject验签参数(需要先把验签的字符串消息转换为 Object 对象)

Demo

包含业务参数

提示

以“统一收单交易关闭接口在新窗口打开”为例,因为“公共请求参数”中包含 biz_content 所以需要通过 bizContent 传递文档下方的“请求参数”:

统一收单交易关闭接口详情

const result = await alipay.exec('alipay.trade.close', {
    notifyUrl: 'http://notify_url',
    appAuthToken: '',
    // 通过 bizContent 传递请求参数
    bizContent: {
        tradeNo: '',
        outTradeNo: '',
        operatorId: '',
    },
});
// 从官方文档看到,result 包含 tradeNo、outTradeNo 2 个 key
console.log('tradeNo: %s, outTradeNo: %s', result.tradeNo, result.outTradeNo);
1
2
3
4
5
6
7
8
9
10
11
12

不包含业务参数

提示

以“换取授权访问令牌在新窗口打开”为例,因为“公共请求参数”中不包含 biz_content 所以参数需要直接放到 params 中:

换取授权访问令牌详情

const result = await alipay.exec('alipay.system.oauth.token', {
    // 请求参数
    grantType: 'authorization_code',
    code: 'code',
    refreshToken: 'token',
});
// result 为 API 介绍内容中 “响应参数” 对应的结果
console.log(result);
1
2
3
4
5
6
7
8