支付

cool-admin 自带封装了微信和支付宝支付

微信支付

1、安装插件

npm install @cool-midway/pay

2、引入插件

src/configuration.ts

import { App, Configuration } from '@midwayjs/decorator';
import { ILifeCycle, IMidwayContainer } from '@midwayjs/core';
import { Application } from 'egg';
import * as orm from '@midwayjs/orm';
import * as cool from '@cool-midway/core';
import * as pay from '@cool-midway/pay';

@Configuration({
  // 注意组件顺序 cool 有依赖orm组件, 所以必须放在,orm组件之后 cool的其他组件必须放在cool 核心组件之后
  imports: [
    pay,
  ],
})
export class ContainerLifeCycle {
  @App()
  app: Application;
  // 应用启动完成
  async onReady(container?: IMidwayContainer) {}
  // 应用停止
  async onStop() {}
}

3、配置

也可以在src/config/xxx.ts配置(两种配置都存在,此种方式优先)

config.cool = {
  pay:{
    wx: {
        appid: '公众号ID',
        mchid: '微信商户号',
        partnerKey: '微信支付安全密钥',
        pfx: require('fs').readFileSync('证书文件路径'),
        notify_url: '支付回调网址',
        spbill_create_ip: 'IP地址'
    },
  }
};

4、扫码支付DEMO

其他支付方式可以参考微信支付APIopen in new window

import { App, Inject, Post, Provide } from '@midwayjs/decorator';
import { IMidwayWebApplication } from '@midwayjs/web';
import { Context } from 'egg';
import { CoolController, BaseController } from '@cool-midway/core';
import { CoolWxPay } from '@cool-midway/pay';
import { parseString } from 'xml2js';

/**
 * 支付示例
 */
@Provide()
@CoolController()
export class DemoPayController extends BaseController {
  // 微信支付
  @Inject()
  wxPay: CoolWxPay;

  @Inject()
  ctx: Context;

  @App()
  app: IMidwayWebApplication;

  /**
   * 扫码支付
   */
  @Post('/wx')
  async wx() {
    // const a = this.app.getApplicationContext().registry.keys();
    // console.log(a);
    const orderNum = await this.wxPay.createOrderNum();
    const data = await this.wxPay.getInstance().unifiedOrder({
      out_trade_no: orderNum,
      body: '测试微信支付',
      total_fee: 1,
      trade_type: 'NATIVE',
      product_id: 'test001',
    });
    return this.ok(data);
  }

  /**
   * 微信支付通知回调
   */
  @Post('/wxNotify')
  async wxNotify() {
    let data = '';
    this.ctx.req.setEncoding('utf8');
    this.ctx.req.on('data', chunk => {
      data += chunk;
    });
    const results = await new Promise((resolve, reject) => {
      this.ctx.req.on('end', () => {
        parseString(data, { explicitArray: false }, async (err, json) => {
          if (err) {
            return reject('success');
          }
          const checkSign = await this.wxPay.signVerify(json.xml);
          if (checkSign && json.xml.result_code === 'SUCCESS') {
            // 处理业务逻辑
            console.log('微信支付成功', json.xml);
            return resolve(true);
          }
          return resolve(false);
        });
      });
    });
    if (results) {
      this.ctx.body =
        '<xml><return_msg>OK</return_msg><return_code>SUCCESS</return_code></xml>';
    }
  }
}

支付宝支付

1、安装插件

@cool-midway/pay

2、引入插件

src/configuration.ts

import { App, Configuration } from '@midwayjs/decorator';
import { ILifeCycle, IMidwayContainer } from '@midwayjs/core';
import { Application } from 'egg';
import * as orm from '@midwayjs/orm';
import * as cool from '@cool-midway/core';
import * as pay from '@cool-midway/pay';

@Configuration({
  // 注意组件顺序 cool 有依赖orm组件, 所以必须放在,orm组件之后 cool的其他组件必须放在cool 核心组件之后
  imports: [
    pay,
  ],
})
export class ContainerLifeCycle {
  @App()
  app: Application;
  // 应用启动完成
  async onReady(container?: IMidwayContainer) {}
  // 应用停止
  async onStop() {}
}

3、配置

也可以在src/config/xxx.ts配置(两种配置都存在,此种方式优先)

config.cool = {
    pay:{
      ali: {
        appId: '2021002197676356',
        notifyUrl: 'http://www.xxx.com/callback/alipay',
        rsaPrivate: path.resolve('./pem/private.pem'),
        rsaPublic: path.resolve('./pem/ali_public.pem'),
        sandbox: true,
        signType: 'RSA2',
    },
    }
};

WARNING

公钥是支付宝的公钥,不是自己生成的,私钥才是自己生成的,并且要添加首尾、以每行64字符进行断行,如:

-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQCbc/e1JYkfcJ54+9d+l/cIuv5X3j71qREf/06WGIhewt4liu38
MzSTLJWc4HOotfeHraPpwDJ5YipYwGIfaiDDqZRfZuy+rEyQT8LInnU6OTzVkUvK
+2NMIlyOitC5sb3p61ceRyAsRM1sF7x3DszVY253aokjr82u0yXgOttu8QIDAQAB
AoGAbv11tth99vypqSfmzHQj5Q/d2U7NFQkJORdIPNJ3S3FGuvdew9qrhwkmKUP4
UFTbzvujNJoNb60vHv79EADuMqeZxnP4fHRRPoWFtYSCXf2rLQKUJaPlZLx6oiSh
5spL3wOT/hfh9qNlzz/+HRT4P8chXn0OkO4hQRCWoPmSw4ECQQDWkgCJkYAq0gIb
m1VTiwvfHiJLT1VV01gksOOXpW8i8DUeZDGWMslUsqoefu8HenytKzOvvTOYQEer
2238c9fFAkEAuXfa30m8DOSXGGz7OXOv3KFVZyf2wzh1AltywW0kw0+PKbiSjR/n
LQybKcsuX+EXodEWIcFmlysaovs3oxhBPQJBAJtPcP4iiD/2ZLow1DE1azFjsXUL
hnwqDxn3w7VHdMs4TWqjIVVTi3E4JXUPcdra6RW7OJ1S+N6SYI5ftRvPifUCQQCY
hYc6DwIVvDrBfIYRFiEumIKKJaRZoOkguiGiDeaos5mxHrduVSkgs/g6I3wMnyh3
C2Je+hQrBuiN1XhIqJ6lAkEAmYu2ap+vqHgsjDksnDy5zwMCzywbUBvGIa53zfyi
KYoEmSaDc3AMqaxbxGHwMvPupGTvwiYPyQ+E0Qf5PXa5Kw==
-----END RSA PRIVATE KEY-----
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDIgHnOn7LLILlKETd6BFRJ0Gqg
S2Y3mn1wMQmyh9zEyWlz5p1zrahRahbXAfCfSqshSNfqOmAQzSHRVjCqjsAw1jyq
rXaPdKBmr90DIpIxmIyKXv4GGAkPyJ/6FTFY99uhpiq0qadD/uSzQsefWo0aTvP/
65zi3eof7TcZ32oWpwIDAQAB
-----END PUBLIC KEY-----

4、APP支付DEMO

其他支付方式可以参考支付宝支付APIopen in new window

import { App, Inject, Post, Provide } from '@midwayjs/decorator';
import { IMidwayWebApplication } from '@midwayjs/web';
import { Context } from 'egg';
import { CoolController, BaseController } from '@cool-midway/core';
import { ICoolAliPay } from '@cool-midway/wxpay';
import { parseString } from 'xml2js';

/**
 * 支付示例
 */
@Provide()
@CoolController()
export class DemoPayController extends BaseController {
   // 支付宝支付
  @Inject('alipay:sdk')
  aliPay: ICoolAliPay;

  @Inject()
  ctx: Context;

  @App()
  app: IMidwayWebApplication;

  /**
   * 支付宝app支付
   * @returns
   */
  @Post('/alipay')
  async alipay() {
    const orderNum = await this.aliPay.createOrderNum();
    // app支付
    const params = await this.aliPay.getInstance().appPay({
      subject: '测试商品',
      body: '测试商品描述',
      outTradeId: orderNum,
      timeout: '10m',
      amount: '10.00',
      goodsType: '0',
    });
    return this.ok(params);
  }

  /**
   * 支付宝支付回调
   */
  @Post('/aliNotify')
  async aliNotify(@Body(ALL) body: any) {
    const { trade_status, out_trade_no } = body;
    const check = await this.aliPay.signVerify(body);
    if (check && trade_status === 'TRADE_SUCCESS') {
      // 处理逻辑
      console.log('支付宝支付成功', out_trade_no);
    }
    this.ctx.body = 'success';
  }
}

Last Updated: