ChannelEnum.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453
  1. <?php
  2. namespace app\common\Enum;
  3. /**
  4. * 渠道枚举类
  5. */
  6. class ChannelEnum
  7. {
  8. // ============ 渠道类型 ============
  9. const CHANNEL_WECHAT_OFFICIAL_ACCOUNT = 'wechat_official_account'; // 微信公众号
  10. const CHANNEL_WECHAT_MINI_PROGRAM = 'wechat_mini_program'; // 微信小程序
  11. const CHANNEL_IOS_APP = 'ios_app'; // iOS APP
  12. const CHANNEL_ANDROID_APP = 'android_app'; // Android APP
  13. const CHANNEL_H5 = 'h5'; // H5
  14. const CHANNEL_DOUYIN_MINI_PROGRAM = 'douyin_mini_program'; // 抖音小程序
  15. const CHANNEL_PC = 'pc'; // PC
  16. const CHANNEL_QQ_MINI_PROGRAM = 'qq_mini_program'; // QQ小程序
  17. const CHANNEL_ALIPAY_MINI_PROGRAM = 'alipay_mini_program'; // 支付宝小程序
  18. // ============ 渠道分组 ============
  19. const GROUP_WECHAT = 'wechat'; // 微信生态
  20. const GROUP_MOBILE_APP = 'mobile_app'; // 移动应用
  21. const GROUP_WEB = 'web'; // 网页端
  22. const GROUP_MINI_PROGRAM = 'mini_program'; // 小程序
  23. /**
  24. * 获取渠道映射
  25. */
  26. public static function getChannelMap()
  27. {
  28. return [
  29. // self::CHANNEL_WECHAT_OFFICIAL_ACCOUNT => '微信公众号',
  30. // self::CHANNEL_WECHAT_MINI_PROGRAM => '微信小程序',
  31. // self::CHANNEL_IOS_APP => 'iOS APP',
  32. // self::CHANNEL_ANDROID_APP => 'Android APP',
  33. // self::CHANNEL_H5 => 'H5',
  34. self::CHANNEL_DOUYIN_MINI_PROGRAM => '抖音小程序',
  35. // self::CHANNEL_PC => 'PC',
  36. // self::CHANNEL_QQ_MINI_PROGRAM => 'QQ小程序',
  37. // self::CHANNEL_ALIPAY_MINI_PROGRAM => '支付宝小程序',
  38. ];
  39. }
  40. /**
  41. * 获取渠道分组映射
  42. */
  43. public static function getChannelGroupMap()
  44. {
  45. return [
  46. self::GROUP_WECHAT => '微信生态',
  47. self::GROUP_MOBILE_APP => '移动应用',
  48. self::GROUP_WEB => '网页端',
  49. self::GROUP_MINI_PROGRAM => '小程序',
  50. ];
  51. }
  52. /**
  53. * 获取按分组组织的渠道
  54. */
  55. public static function getChannelsByGroup()
  56. {
  57. return [
  58. self::GROUP_WECHAT => [
  59. self::CHANNEL_WECHAT_OFFICIAL_ACCOUNT => '微信公众号',
  60. self::CHANNEL_WECHAT_MINI_PROGRAM => '微信小程序',
  61. ],
  62. self::GROUP_MOBILE_APP => [
  63. self::CHANNEL_IOS_APP => 'iOS APP',
  64. self::CHANNEL_ANDROID_APP => 'Android APP',
  65. ],
  66. self::GROUP_WEB => [
  67. self::CHANNEL_H5 => 'H5',
  68. self::CHANNEL_PC => 'PC',
  69. ],
  70. self::GROUP_MINI_PROGRAM => [
  71. self::CHANNEL_WECHAT_MINI_PROGRAM => '微信小程序',
  72. self::CHANNEL_DOUYIN_MINI_PROGRAM => '抖音小程序',
  73. self::CHANNEL_QQ_MINI_PROGRAM => 'QQ小程序',
  74. self::CHANNEL_ALIPAY_MINI_PROGRAM => '支付宝小程序',
  75. ],
  76. ];
  77. }
  78. /**
  79. * 获取渠道标识映射(用于API接口)
  80. */
  81. public static function getChannelCodeMap()
  82. {
  83. return [
  84. self::CHANNEL_WECHAT_OFFICIAL_ACCOUNT => 'wechat_official_account',
  85. self::CHANNEL_WECHAT_MINI_PROGRAM => 'wechat_mini_program',
  86. self::CHANNEL_IOS_APP => 'ios_app',
  87. self::CHANNEL_ANDROID_APP => 'android_app',
  88. self::CHANNEL_H5 => 'h5',
  89. self::CHANNEL_DOUYIN_MINI_PROGRAM => 'douyin_mini_program',
  90. self::CHANNEL_PC => 'pc',
  91. self::CHANNEL_QQ_MINI_PROGRAM => 'qq_mini_program',
  92. self::CHANNEL_ALIPAY_MINI_PROGRAM => 'alipay_mini_program',
  93. ];
  94. }
  95. /**
  96. * 获取渠道文本
  97. */
  98. public static function getChannelText($channel)
  99. {
  100. $map = self::getChannelMap();
  101. return $map[$channel] ?? '未知渠道';
  102. }
  103. /**
  104. * 获取渠道标识
  105. */
  106. public static function getChannelCode($channel)
  107. {
  108. $map = self::getChannelCodeMap();
  109. return $map[$channel] ?? 'unknown';
  110. }
  111. /**
  112. * 根据渠道标识获取渠道ID
  113. */
  114. public static function getChannelByCode($code)
  115. {
  116. $map = array_flip(self::getChannelCodeMap());
  117. return $map[$code] ?? null;
  118. }
  119. /**
  120. * 验证渠道是否有效
  121. */
  122. public static function isValidChannel($channel)
  123. {
  124. return array_key_exists($channel, self::getChannelMap());
  125. }
  126. /**
  127. * 判断是否为微信生态渠道
  128. */
  129. public static function isWechatChannel($channel)
  130. {
  131. return in_array($channel, [
  132. self::CHANNEL_WECHAT_OFFICIAL_ACCOUNT,
  133. self::CHANNEL_WECHAT_MINI_PROGRAM,
  134. ]);
  135. }
  136. /**
  137. * 判断是否为小程序渠道
  138. */
  139. public static function isMiniProgramChannel($channel)
  140. {
  141. return in_array($channel, [
  142. self::CHANNEL_WECHAT_MINI_PROGRAM,
  143. self::CHANNEL_DOUYIN_MINI_PROGRAM,
  144. self::CHANNEL_QQ_MINI_PROGRAM,
  145. self::CHANNEL_ALIPAY_MINI_PROGRAM,
  146. ]);
  147. }
  148. /**
  149. * 判断是否为移动端渠道
  150. */
  151. public static function isMobileChannel($channel)
  152. {
  153. return in_array($channel, [
  154. self::CHANNEL_IOS_APP,
  155. self::CHANNEL_ANDROID_APP,
  156. self::CHANNEL_H5,
  157. self::CHANNEL_WECHAT_MINI_PROGRAM,
  158. self::CHANNEL_DOUYIN_MINI_PROGRAM,
  159. self::CHANNEL_QQ_MINI_PROGRAM,
  160. self::CHANNEL_ALIPAY_MINI_PROGRAM,
  161. ]);
  162. }
  163. /**
  164. * 判断是否为桌面端渠道
  165. */
  166. public static function isDesktopChannel($channel)
  167. {
  168. return in_array($channel, [
  169. self::CHANNEL_PC,
  170. ]);
  171. }
  172. /**
  173. * 获取渠道支持的功能
  174. */
  175. public static function getChannelFeatures($channel)
  176. {
  177. $features = [
  178. self::CHANNEL_WECHAT_OFFICIAL_ACCOUNT => [
  179. 'payment' => true,
  180. 'share' => true,
  181. 'location' => true,
  182. 'camera' => false,
  183. 'push' => true,
  184. ],
  185. self::CHANNEL_WECHAT_MINI_PROGRAM => [
  186. 'payment' => true,
  187. 'share' => true,
  188. 'location' => true,
  189. 'camera' => true,
  190. 'push' => true,
  191. ],
  192. self::CHANNEL_IOS_APP => [
  193. 'payment' => true,
  194. 'share' => true,
  195. 'location' => true,
  196. 'camera' => true,
  197. 'push' => true,
  198. ],
  199. self::CHANNEL_ANDROID_APP => [
  200. 'payment' => true,
  201. 'share' => true,
  202. 'location' => true,
  203. 'camera' => true,
  204. 'push' => true,
  205. ],
  206. self::CHANNEL_H5 => [
  207. 'payment' => true,
  208. 'share' => true,
  209. 'location' => true,
  210. 'camera' => true,
  211. 'push' => false,
  212. ],
  213. self::CHANNEL_DOUYIN_MINI_PROGRAM => [
  214. 'payment' => true,
  215. 'share' => true,
  216. 'location' => true,
  217. 'camera' => true,
  218. 'push' => true,
  219. ],
  220. self::CHANNEL_PC => [
  221. 'payment' => true,
  222. 'share' => false,
  223. 'location' => false,
  224. 'camera' => false,
  225. 'push' => false,
  226. ],
  227. self::CHANNEL_QQ_MINI_PROGRAM => [
  228. 'payment' => true,
  229. 'share' => true,
  230. 'location' => true,
  231. 'camera' => true,
  232. 'push' => true,
  233. ],
  234. self::CHANNEL_ALIPAY_MINI_PROGRAM => [
  235. 'payment' => true,
  236. 'share' => true,
  237. 'location' => true,
  238. 'camera' => true,
  239. 'push' => true,
  240. ],
  241. ];
  242. return $features[$channel] ?? [];
  243. }
  244. /**
  245. * 检查渠道是否支持某个功能
  246. */
  247. public static function channelSupportsFeature($channel, $feature)
  248. {
  249. $features = self::getChannelFeatures($channel);
  250. return $features[$feature] ?? false;
  251. }
  252. // ============ 支付方式枚举 ============
  253. const PAYMENT_WECHAT = 'wechat'; // 微信支付
  254. const PAYMENT_ALIPAY = 'alipay'; // 支付宝支付
  255. const PAYMENT_BALANCE = 'balance'; // 余额支付
  256. const PAYMENT_OFFLINE = 'offline'; // 线下支付
  257. const PAYMENT_COD = 'cod'; // 货到付款
  258. const PAYMENT_DOUYIN = 'douyin'; // 抖音支付
  259. /**
  260. * 获取支付方式映射
  261. */
  262. public static function getPaymentMap()
  263. {
  264. return [
  265. self::PAYMENT_WECHAT => '微信支付',
  266. self::PAYMENT_ALIPAY => '支付宝支付',
  267. self::PAYMENT_BALANCE => '余额支付',
  268. self::PAYMENT_OFFLINE => '线下支付',
  269. self::PAYMENT_COD => '货到付款', //货到付款
  270. self::PAYMENT_DOUYIN => '抖音支付',
  271. ];
  272. }
  273. /**
  274. * 获取渠道支持的支付方式
  275. */
  276. public static function getChannelSupportedPayments($channel)
  277. {
  278. $channelPayments = [
  279. self::CHANNEL_WECHAT_OFFICIAL_ACCOUNT => [
  280. self::PAYMENT_WECHAT,
  281. self::PAYMENT_ALIPAY,
  282. self::PAYMENT_BALANCE,
  283. self::PAYMENT_COD,
  284. ],
  285. self::CHANNEL_WECHAT_MINI_PROGRAM => [
  286. self::PAYMENT_WECHAT,
  287. //self::PAYMENT_ALIPAY,
  288. //self::PAYMENT_BALANCE,
  289. //self::PAYMENT_COD,
  290. ],
  291. self::CHANNEL_DOUYIN_MINI_PROGRAM => [
  292. self::PAYMENT_WECHAT,
  293. self::PAYMENT_ALIPAY,
  294. // self::PAYMENT_BALANCE,
  295. // self::PAYMENT_COD,
  296. self::PAYMENT_DOUYIN,
  297. ],
  298. self::CHANNEL_IOS_APP => [
  299. self::PAYMENT_WECHAT,
  300. self::PAYMENT_ALIPAY,
  301. //self::PAYMENT_BALANCE,
  302. //self::PAYMENT_COD,
  303. ],
  304. self::CHANNEL_ANDROID_APP => [
  305. self::PAYMENT_WECHAT,
  306. self::PAYMENT_ALIPAY,
  307. //self::PAYMENT_BALANCE,
  308. //self::PAYMENT_COD,
  309. ],
  310. self::CHANNEL_PC => [
  311. self::PAYMENT_ALIPAY,
  312. self::PAYMENT_BALANCE,
  313. self::PAYMENT_OFFLINE,
  314. self::PAYMENT_COD,
  315. ],
  316. self::CHANNEL_QQ_MINI_PROGRAM => [
  317. self::PAYMENT_WECHAT,
  318. self::PAYMENT_ALIPAY,
  319. self::PAYMENT_BALANCE,
  320. self::PAYMENT_COD,
  321. ],
  322. self::CHANNEL_ALIPAY_MINI_PROGRAM => [
  323. self::PAYMENT_WECHAT,
  324. self::PAYMENT_ALIPAY,
  325. self::PAYMENT_BALANCE,
  326. self::PAYMENT_COD,
  327. ],
  328. ];
  329. return $channelPayments[$channel] ?? [self::PAYMENT_BALANCE];
  330. }
  331. /**
  332. * 检查渠道是否支持指定支付方式
  333. */
  334. public static function channelSupportsPayment($channel, $payment)
  335. {
  336. $supportedPayments = self::getChannelSupportedPayments($channel);
  337. return in_array($payment, $supportedPayments);
  338. }
  339. /**
  340. * 获取渠道推荐的支付方式(按优先级排序)
  341. */
  342. public static function getChannelRecommendedPayments($channel)
  343. {
  344. $recommendedPayments = [
  345. self::CHANNEL_WECHAT_OFFICIAL_ACCOUNT => [
  346. self::PAYMENT_WECHAT,
  347. self::PAYMENT_BALANCE,
  348. ],
  349. self::CHANNEL_WECHAT_MINI_PROGRAM => [
  350. self::PAYMENT_WECHAT,
  351. self::PAYMENT_BALANCE,
  352. ],
  353. self::CHANNEL_IOS_APP => [
  354. self::PAYMENT_WECHAT,
  355. self::PAYMENT_ALIPAY,
  356. self::PAYMENT_BALANCE
  357. ],
  358. self::CHANNEL_ANDROID_APP => [
  359. self::PAYMENT_ALIPAY,
  360. self::PAYMENT_WECHAT,
  361. self::PAYMENT_BALANCE
  362. ],
  363. self::CHANNEL_PC => [
  364. self::PAYMENT_ALIPAY,
  365. self::PAYMENT_OFFLINE,
  366. self::PAYMENT_BALANCE
  367. ],
  368. self::CHANNEL_QQ_MINI_PROGRAM => [
  369. self::PAYMENT_WECHAT,
  370. self::PAYMENT_BALANCE
  371. ],
  372. self::CHANNEL_ALIPAY_MINI_PROGRAM => [
  373. self::PAYMENT_WECHAT,
  374. self::PAYMENT_ALIPAY,
  375. self::PAYMENT_BALANCE
  376. ],
  377. ];
  378. return $recommendedPayments[$channel] ?? [self::PAYMENT_BALANCE];
  379. }
  380. /**
  381. * 获取支付方式的渠道兼容性
  382. */
  383. public static function getPaymentChannelCompatibility($payment)
  384. {
  385. $compatibility = [
  386. self::PAYMENT_WECHAT => [
  387. 'supported' => [
  388. self::CHANNEL_WECHAT_OFFICIAL_ACCOUNT,
  389. self::CHANNEL_WECHAT_MINI_PROGRAM,
  390. self::CHANNEL_IOS_APP,
  391. self::CHANNEL_ANDROID_APP,
  392. self::CHANNEL_H5,
  393. ],
  394. 'recommended' => [
  395. self::CHANNEL_WECHAT_OFFICIAL_ACCOUNT,
  396. self::CHANNEL_WECHAT_MINI_PROGRAM,
  397. ],
  398. ],
  399. self::PAYMENT_ALIPAY => [
  400. 'supported' => [
  401. self::CHANNEL_IOS_APP,
  402. self::CHANNEL_ANDROID_APP,
  403. self::CHANNEL_H5,
  404. self::CHANNEL_PC,
  405. self::CHANNEL_DOUYIN_MINI_PROGRAM,
  406. self::CHANNEL_ALIPAY_MINI_PROGRAM,
  407. ],
  408. 'recommended' => [
  409. self::CHANNEL_ALIPAY_MINI_PROGRAM,
  410. self::CHANNEL_PC,
  411. self::CHANNEL_H5,
  412. ],
  413. ],
  414. self::PAYMENT_BALANCE => [
  415. 'supported' => array_keys(self::getChannelMap()),
  416. 'recommended' => array_keys(self::getChannelMap()),
  417. ],
  418. self::PAYMENT_OFFLINE => [
  419. 'supported' => [self::CHANNEL_PC],
  420. 'recommended' => [self::CHANNEL_PC],
  421. ],
  422. ];
  423. return $compatibility[$payment] ?? ['supported' => [], 'recommended' => []];
  424. }
  425. }