/** * 订单服务模块 * 负责订单创建和支付相关的逻辑 */ import { campApi } from '../../../config/camp_api.js'; import * as dataFetcher from './data-fetcher.js'; /** * 创建订单并支付 * @param {Object} context - 页面上下文 * @param {String} sectionId - 小节ID * @param {Number} priceFen - 价格(分) * @param {Object} section - 小节信息 */ export function createOrderAndPay(context, sectionId, priceFen, section) { var campId = context.data.campId; var userId = wx.getStorageSync('wxuserid') || ''; var openid = wx.getStorageSync('wxopenid') || ''; if (!userId || !openid) { wx.showToast({ title: '用户信息缺失,请重新登录', icon: 'none' }); return Promise.resolve(false); } // 创建订单(包含 openid,后端会自动生成预支付信息) var orderData = { user_id: String(userId), camp_id: String(campId), section_id: String(sectionId), payment_method: 'WECHAT', openid: openid }; return campApi.createOrder(orderData) .then(function (orderRes) { if (!orderRes || orderRes.success !== true || !orderRes.order_id) { throw new Error(orderRes && orderRes.message || '创建订单失败'); } var orderId = orderRes.order_id; // 如果订单金额为0,直接成功(免费订单) if (orderRes.actual_amount === 0 || orderRes.order_status === 'PAID') { wx.showToast({ title: '订单创建成功', icon: 'success' }); dataFetcher.fetchCampData(context, campId); return true; } // 如果返回了预支付信息,直接调起微信支付 if (orderRes.prepay_id && orderRes.pay_sign) { var payParams = { timeStamp: orderRes.time_stamp || orderRes.timeStamp, nonceStr: orderRes.nonce_str || orderRes.nonceStr, package: orderRes.package || 'prepay_id=' + orderRes.prepay_id, signType: orderRes.sign_type || orderRes.signType || 'RSA', paySign: orderRes.pay_sign || orderRes.paySign }; return new Promise(function (resolve, reject) { wx.requestPayment({ timeStamp: payParams.timeStamp, nonceStr: payParams.nonceStr, package: payParams.package, signType: payParams.signType, paySign: payParams.paySign, success: function (res) { wx.showToast({ title: '支付成功', icon: 'success' }); dataFetcher.fetchCampData(context, campId); resolve(true); }, fail: function (err) { if (err.errMsg === 'requestPayment:fail cancel') { // 用户取消支付,调用取消订单接口 campApi.cancelOrder({ order_id: orderId }) .then(function (cancelRes) { wx.showToast({ title: '已取消支付', icon: 'none' }); }) .catch(function (cancelErr) { wx.showToast({ title: '已取消支付', icon: 'none' }); }); } else { wx.showToast({ title: '支付失败', icon: 'none' }); } reject(err); } }); }); } else { // 如果没有预支付信息,说明订单创建成功但不需要支付 wx.showToast({ title: '订单创建成功', icon: 'success' }); dataFetcher.fetchCampData(context, campId); return true; } }) .catch(function (err) { wx.showToast({ title: err && err.message || '支付失败', icon: 'none' }); return false; }); }