index.ts 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. import { createOrderApi, orderNotifyApi, paymentApi } from "../../api/order.api";
  2. import { getDeviceInfo } from "../../utils/wechat";
  3. import DnSdk from "../../lib/DnSdk";
  4. import { setStorage } from "../../store";
  5. import { throttle, unixTimestamp } from "../../utils/helper";
  6. import UserInfoModel from "../../store/models/user.model";
  7. import { silentLogin } from "../auth/wechat/wechat-auth";
  8. import { serverLogin } from "../auth/server/server-auth";
  9. /**
  10. * 创建订单
  11. * @param orderData 订单信息
  12. */
  13. export const createOrder = async (orderData) => {
  14. try {
  15. let { cp_order_id, money, product_id, product_name, server_id, server_name, role_id, role_name, role_level, ext } = orderData;
  16. // 创建订单
  17. const createOrderResult = await createOrderApi({
  18. cp_order_id,
  19. money,
  20. product_id,
  21. product_name,
  22. server_id,
  23. server_name,
  24. role_id,
  25. role_name,
  26. role_level,
  27. ext,
  28. })
  29. const { inapp, wechat_jsapi } = createOrderResult.pay_channel;
  30. let midasPayParams = {}
  31. let gzhPayParams = {}
  32. const payUrlRes = await getPayUrl(createOrderResult)
  33. const curOrderInfo = {
  34. ...payUrlRes,
  35. pay_type: inapp ? "midas" : wechat_jsapi ? "kf" : "",
  36. ext,
  37. money,
  38. order_id: createOrderResult.order_id,
  39. inapp,
  40. product_name
  41. }
  42. if (inapp) {
  43. midasPayParams = typeof payUrlRes !== 'undefined' ? { ...payUrlRes, pay_type: "midas" } : {}
  44. }
  45. if (wechat_jsapi) {
  46. let from = { "order_id": createOrderResult.order_id, pay_channel_id: wechat_jsapi }
  47. gzhPayParams = {
  48. sessionFrom: JSON.stringify(from),
  49. showMessageCard: true,
  50. sendMessagePath: "",
  51. sendMessageTitle: "",
  52. sendMessageImage: `${import.meta.env.SDK_API_BASE}/img/pay.png`,
  53. pay_type: "w_gzh"
  54. }
  55. }
  56. return Promise.resolve({
  57. midasPayParams,
  58. gzhPayParams,
  59. curOrderInfo
  60. })
  61. } catch (error) {
  62. return Promise.reject(error)
  63. }
  64. }
  65. /**
  66. * 获取支付链接
  67. */
  68. const getPayUrl = async (createOrderResult) => {
  69. const platform = getDeviceInfo('platform')
  70. if (platform === 'ios') {
  71. return Promise.resolve({})
  72. }
  73. try {
  74. let params = {
  75. order_id: createOrderResult.order_id,
  76. pay_channel_id: createOrderResult.pay_channel.inapp ? createOrderResult.pay_channel.inapp : createOrderResult.pay_channel.wechat_jsapi
  77. }
  78. const payUrlRes = await paymentApi(params)
  79. return Promise.resolve(payUrlRes)
  80. } catch (error) {
  81. return Promise.reject(error)
  82. }
  83. }
  84. /**
  85. * 拉起支付
  86. * @param curOrderInfo 订单信息
  87. * @param gzhPayParams 公众号支付参数
  88. */
  89. const makePay = async ({ curOrderInfo, gzhPayParams }) => {
  90. const platform = getDeviceInfo('platform')
  91. if (curOrderInfo.pay_type === "midas") {
  92. if ("ios" === platform) {
  93. return Promise.resolve("MIDAS_IOS");
  94. } else {
  95. // return Promise.resolve();
  96. wx.checkSession({
  97. success() {
  98. return Promise.resolve();
  99. },
  100. fail() {
  101. UserInfoModel.getInstance().clear();
  102. // 获取用户信息
  103. silentLogin()
  104. .then(function (silentLoginRes) {
  105. serverLogin(silentLoginRes)
  106. .then(function () {
  107. return Promise.resolve();
  108. })
  109. .catch((error) => {
  110. return Promise.reject(error);
  111. });
  112. })
  113. .catch((error) => {
  114. return Promise.reject(error);
  115. });
  116. },
  117. });
  118. }
  119. } else if (curOrderInfo.pay_type === "kf") {
  120. // 拉起客服消息
  121. wx.openCustomerServiceConversation({
  122. sessionFrom: gzhPayParams.sessionFrom,
  123. showMessageCard: gzhPayParams.showMessageCard,
  124. sendMessagePath: gzhPayParams.sendMessagePath,
  125. sendMessageTitle: gzhPayParams.sendMessageTitle,
  126. sendMessageImg: gzhPayParams.sendMessageImage,
  127. });
  128. console.log("kfkkk===>", {
  129. sessionFrom: gzhPayParams.sessionFrom,
  130. showMessageCard: gzhPayParams.showMessageCard,
  131. sendMessagePath: gzhPayParams.sendMessagePath,
  132. sendMessageTitle: gzhPayParams.sendMessageTitle,
  133. sendMessageImg: gzhPayParams.sendMessageImage,
  134. })
  135. return Promise.resolve("CUSTOMER");
  136. }
  137. }
  138. const midasPay = async ({ curOrderInfo, midasPayParams }) => {
  139. let platform = getDeviceInfo('platform')
  140. console.log({
  141. mode: "game",
  142. env: midasPayParams.env,
  143. offerId: midasPayParams.offerId,
  144. currencyType: "CNY",
  145. platform: platform,
  146. buyQuantity: midasPayParams.buyQuantity,
  147. amt: curOrderInfo.money,
  148. zoneId: midasPayParams.zoneId,
  149. outTradeNo: curOrderInfo.order_id,
  150. })
  151. return new Promise((resolve, reject) => {
  152. // console.log("curOrderInfo.money * 100", curOrderInfo.money * 100)
  153. wx.requestMidasPayment({
  154. mode: "game",
  155. env: midasPayParams.env,
  156. offerId: midasPayParams.offerId,
  157. currencyType: "CNY",
  158. platform: platform,
  159. buyQuantity: midasPayParams.buyQuantity,
  160. amt: curOrderInfo.money,
  161. zoneId: midasPayParams.zoneId,
  162. outTradeNo: curOrderInfo.order_id,
  163. success: (res) => {
  164. // 腾讯广告小游戏SDK上报支付
  165. DnSdk.getInstance().onPurchase(curOrderInfo.money * 100);
  166. // 支付成功后回调
  167. const payChannelId = curOrderInfo.inapp;
  168. orderNotifyApi(payChannelId, {
  169. money: curOrderInfo.money,
  170. order_id: curOrderInfo.order_id,
  171. callback_type: "client",
  172. });
  173. resolve(res);
  174. },
  175. fail: (error) => {
  176. reject(error); // ✅ 正确传递,外层 try/catch 能捕获
  177. },
  178. });
  179. });
  180. };
  181. /**
  182. * @description: 内部支付函数
  183. * @param {*} payParams
  184. * @return {*}
  185. */
  186. const _payment = async (payParams) => {
  187. try {
  188. const orderInfo = {
  189. cp_order_id: payParams.cp_order_id,
  190. money: payParams.money,
  191. role_id: payParams.role_id,
  192. role_name: payParams.role_name,
  193. server_id: payParams.server_id,
  194. server_name: payParams.server_name,
  195. ext: payParams.ext ? payParams.ext : "",
  196. role_level: payParams.role_level,
  197. product_id: payParams.product_id,
  198. product_name: payParams.product_name,
  199. };
  200. // 下单
  201. const { curOrderInfo, midasPayParams, gzhPayParams } = await createOrder(
  202. orderInfo
  203. );
  204. // 非米大师支付使用本地定时器检查上报
  205. if (curOrderInfo.pay_type != "midas") {
  206. setStorage("extOrderAndReport_" + curOrderInfo.order_id, {
  207. ext: curOrderInfo.ext,
  208. money: curOrderInfo.money,
  209. order_id: curOrderInfo.order_id,
  210. product_name: curOrderInfo.product_name || "Purchase Item",
  211. timestamp: unixTimestamp(),
  212. reportCount: 0,
  213. });
  214. }
  215. const res = await makePay({ curOrderInfo, gzhPayParams });
  216. wx.hideLoading();
  217. // 二维码+url 二合一
  218. if (typeof res === "object") {
  219. return Promise.resolve({
  220. code: 0,
  221. data: res,
  222. msg: "订单创建成功",
  223. });
  224. }
  225. if (res === "CUSTOMER") {
  226. //客服已经拉起成功
  227. return Promise.resolve({
  228. code: 0,
  229. data: null,
  230. msg: "订单创建成功",
  231. });
  232. }
  233. // 小游戏米大师
  234. await midasPay({ curOrderInfo, midasPayParams });
  235. return Promise.resolve({
  236. code: 0,
  237. data: null,
  238. msg: "订单创建成功",
  239. });
  240. } catch (error) {
  241. return Promise.reject(error);
  242. }
  243. };
  244. /**
  245. * @description:拉起支付(节流版本,避免短时间内重复点击)
  246. * @param {*} payParams
  247. * @return {*}
  248. */
  249. export const payment = throttle(_payment, 2000);