Skip to content
关注公众号,获取新课通知

创建订单和微信支付


安装插件:egg-tenpay

shell
npm i egg-tenpay --save

插件地址:https://www.npmjs.com/package/egg-tenpay

配置:

js
// config/plugin.js
tenpay: {
	enable: true,
	package: 'egg-tenpay'
}
//config/config.default.js
config.webUrl = 'http://127.0.0.1:7001'
// 微信支付配置(最好改成你自己的)
config.tenpay = {
    client: {
      appid: 'wxc559eade7d0a3bde',
      mchid: '1554108981',
      partnerKey: '8b07811ec793049f1c97793464c7049f',
      notify_url: config.webUrl + '/api/gift/notify',
      // sandbox: true
    }
};

控制器:app/controller/api/gift.js

js
	// 微信支付
    async wxpay() {
        const { ctx,app } = this;
        let user_id = ctx.authUser.id
        // 参数验证
        ctx.validate({
            price:{
                type:"int",
                required:true,
                desc:"充值费用"
            }
        })
        const { price } = ctx.request.body
        if(price < 1){
            return ctx.apiFail('至少充值1元')
        }
        // 创建订单
        let no = ctx.randomString(20)
        let order = await app.model.Order.create({
            no,
            user_id,
            price
        })
        if(!order){
            return ctx.apiFail('创建订单失败')
        }
        // 支付
        const result = await app.tenpay.getAppParams({
			out_trade_no:no,
            body: '支付测试',
            total_fee: price * 100,
            trade_type: "APP"
		});
		
		// ctx.logger.error('开始支付');
        // ctx.logger.error(result);
        ctx.apiSuccess(result);
    }

    // 支付回调
    async notify() {
        const { ctx,app,service } = this;
        let info = ctx.request.weixin;
		
		if(!info || info.result_code !== 'SUCCESS'){
			return ctx.reply('支付失败');
		}
        
        // 查询当前订单
		let order = await app.model.Order.findOne({
            where:{
                no:info.out_trade_no
            }
        })
 
        if(!order){
            return ctx.reply('订单不存在');
        }

        // 修改订单状态
        order.status = 'success'
        order.save()

        // 修改用户余额
        let user = await service.user.exist(order.user_id)
        if(user){
            user.coin += parseInt(info.total_fee)/100
            user.save()
        }

		// 回复消息(参数为空回复成功, 传值则为错误消息)
		ctx.reply();
    }

路由:app/router.js

js
router.post("/api/gift/wxpay", controller.api.gift.wxpay);
router.post(
  "/api/gift/notify",
  app.middleware.tenpay("pay", app),
  controller.api.gift.notify,
);