midwayjs +ts 使用tenpay微信 JSAPI 支付教程
时间: 2024-01-24 17:04:38 浏览: 29
首先,你需要在 Midway.js 项目中安装 `tenpay` 包。可以通过以下命令进行安装:
```
npm install tenpay --save
```
接下来,我们需要创建一个 `TenpayService` 类,用于封装微信支付相关的代码。在该类中,我们需要实现以下方法:
- `getPaymentParams`:用于获取微信支付的参数;
- `verifyPaymentResult`:用于验证微信支付结果的有效性。
以下是一个示例 `TenpayService` 类的代码:
```typescript
import { provide } from '@midwayjs/decorator';
import { IWebMiddleware, IMidwayKoaContext } from '@midwayjs/koa';
import { Payment } from 'tenpay';
@provide()
export class TenpayService {
private readonly payment: Payment;
constructor() {
this.payment = new Payment({
appid: 'YOUR_APPID',
mchid: 'YOUR_MCHID',
partnerKey: 'YOUR_PARTNERKEY',
notify_url: 'YOUR_NOTIFY_URL',
spbill_create_ip: 'YOUR_SPBILL_CREATE_IP',
// 是否沙箱环境
sandbox: true
});
}
async getPaymentParams(order: any): Promise<any> {
const params = {
out_trade_no: order.outTradeNo,
body: order.body,
total_fee: order.totalFee,
openid: order.openid,
trade_type: 'JSAPI',
};
const result = await this.payment.getPayParams(params);
return result;
}
async verifyPaymentResult(params: any): Promise<boolean> {
const result = await this.payment.verifyNotify(params);
return result;
}
}
```
其中,`getPaymentParams` 方法会根据订单信息,调用 `tenpay` 包的 `getPayParams` 方法获取微信支付的参数。`verifyPaymentResult` 方法会根据微信支付结果的参数,调用 `tenpay` 包的 `verifyNotify` 方法验证结果的有效性。
接下来,我们可以在控制器中使用 `TenpayService` 类,来实现微信支付功能。以下是一个示例控制器的代码:
```typescript
import { provide, inject } from '@midwayjs/decorator';
import { Context } from 'egg';
import { TenpayService } from './tenpay.service';
@provide()
export class TenpayController {
@inject()
ctx: Context;
@inject()
tenpayService: TenpayService;
async createOrder() {
// 创建订单
const order = {
outTradeNo: 'YOUR_OUT_TRADE_NO',
body: 'YOUR_BODY',
totalFee: 100,
openid: 'YOUR_OPENID',
};
// 获取微信支付参数
const params = await this.tenpayService.getPaymentParams(order);
// 返回给前端的数据
const data = {
appId: params.appId,
timeStamp: params.timeStamp,
nonceStr: params.nonceStr,
package: params.package,
signType: params.signType,
paySign: params.paySign,
};
return data;
}
async notify() {
const params = this.ctx.request.body;
const result = await this.tenpayService.verifyPaymentResult(params);
// 处理支付结果
if (result) {
// 支付成功
// TODO: 处理订单状态等业务逻辑
this.ctx.body = 'success';
} else {
// 支付失败
this.ctx.body = 'fail';
}
}
}
```
以上代码中的 `createOrder` 方法用于创建订单,并调用 `TenpayService` 类的 `getPaymentParams` 方法获取微信支付参数。`notify` 方法用于处理微信支付结果的通知,调用 `TenpayService` 类的 `verifyPaymentResult` 方法验证结果的有效性,并根据结果处理订单状态等业务逻辑。
最后,在 `config/config.default.ts` 中配置路由:
```typescript
import { EggAppConfig, PowerPartial } from 'egg';
import { IWebMiddleware } from '@midwayjs/koa';
export default () => {
const config: PowerPartial<EggAppConfig> = {};
config.middleware = ['errorHandler'];
config.routes = [
{
method: 'POST',
path: '/api/tenpay/createOrder',
action: 'tenpay.createOrder',
},
{
method: 'POST',
path: '/api/tenpay/notify',
action: 'tenpay.notify',
},
];
return config;
};
```
以上就是使用 Midway.js + TypeScript 实现微信 JSAPI 支付的教程。