index.ts 8.9 KB

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