支付
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
其他支付方式可以参考微信支付API
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
其他支付方式可以参考支付宝支付API
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';
}
}