Card.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\modules\admin\models\alipay;
  8. use app\modules\admin\models\AlipayThirdForm;
  9. use app\models\ActivityOrdervoucher;
  10. use app\models\AlipayVoucherCodeTask;
  11. use app\models\AlipayVoucherCode;
  12. use app\models\Coupon;
  13. use app\models\CouponAutoSend;
  14. use app\models\User;
  15. use app\models\Store;
  16. use app\models\SaasUser;
  17. use app\models\AlipayCardTemp;
  18. use app\models\AlipayCard;
  19. use yii\base\Model;
  20. use yii\data\Pagination;
  21. use yii\db\Query;
  22. class Card extends Model
  23. {
  24. public $activity_ordervoucher_id;
  25. public $mini_id;
  26. public $alipay_activity_id;
  27. public $store_id;
  28. public $pageSize = 5;
  29. public $page = 1;
  30. public $publish_start_time;
  31. public $publish_end_time;
  32. public $status;
  33. /**
  34. * {@inheritdoc}
  35. */
  36. public function rules()
  37. {
  38. return [
  39. [['store_id', 'mini_id', 'page', 'pageSize'], 'integer'],
  40. [['publish_start_time', 'publish_end_time', 'status'], 'safe'],
  41. ];
  42. }
  43. //详情
  44. public function tempInfo() {
  45. $model = AlipayCardTemp::findOne(['mini_id' => $this->mini_id, 'is_delete' => 0]);
  46. if($model && $model->template_id){
  47. $form = new AlipayThirdForm();
  48. $form->mini_id = $this->mini_id;
  49. $apires = $form->AlipayMarketingCardTemplateQuery($model->template_id);
  50. if($apires['code'] !== 0){
  51. \Yii::error([__METHOD__, $apires]);
  52. return $apires;
  53. }
  54. }
  55. if($model){
  56. $model->card_action_list = json_decode($model->card_action_list, true);
  57. $model->column_info_list = json_decode($model->column_info_list, true);
  58. $model->template_benefit_info = json_decode($model->template_benefit_info, true);
  59. $model->open_card_conf_card_rights = json_decode($model->open_card_conf_card_rights, true);
  60. }
  61. return [
  62. 'code' => 0,
  63. 'msg' => 'ok',
  64. 'apires' => $apires,
  65. 'data' => $model,
  66. ];
  67. }
  68. //创建
  69. public function tempCreate($params = [], $id = 0, $update = 1) {
  70. $t = \Yii::$app->db->beginTransaction();
  71. $model = $id ? AlipayCardTemp::findOne($id) : new AlipayCardTemp();
  72. if($update || $params['card_show_name']){
  73. $model->mini_id = $this->mini_id;
  74. $model->store_id = $this->store_id;
  75. $model->card_show_name = $params['card_show_name'];
  76. $model->logo_id = $params['logo_id'];
  77. $model->background_id = $params['background_id'];
  78. $model->column_info_list_point = $params['column_info_list_point'];
  79. $model->column_info_list_balance = $params['column_info_list_balance'];
  80. $model->card_action_list = json_encode($params['card_action_list']);
  81. $model->column_info_list = json_encode($params['column_info_list']);
  82. $model->template_benefit_info = json_encode($params['template_benefit_info']);
  83. $model->open_card_conf_card_rights = json_encode($params['open_card_conf_card_rights']);
  84. $model->join_benefit_id = $params['join_benefit_id'];
  85. if(!$model->save()){
  86. $t->rollBack();
  87. return [
  88. 'code' => 1,
  89. 'msg' => array_shift($model->getFirstErrors()),
  90. ];
  91. }
  92. }
  93. $form = new AlipayThirdForm();
  94. $form->mini_id = $this->mini_id;
  95. $biz_content = $this->tempModelToBiz($model);
  96. $res = $form->AlipayMarketingCardTemplateCreate($biz_content, $model->template_id);
  97. if($res['code'] !== 0){
  98. \Yii::error([__METHOD__, $res]);
  99. $t->rollBack();
  100. return $res;
  101. }
  102. $template_id = $res['data']->template_id;
  103. $model->template_id = $template_id;
  104. $model->save();
  105. $t->commit();
  106. //开卡表单
  107. $res2 = $form->AlipayMarketingCardFormtemplateSet($model->template_id);
  108. if($res2['code'] !== 0){
  109. \Yii::error([__METHOD__, $res2]);
  110. $t->rollBack();
  111. return $res2;
  112. }
  113. return $res;
  114. }
  115. public function tempModelToBiz($model) {
  116. $biz_content = [
  117. 'spi_app_id' => '2018xxxxxxx',
  118. 'request_id' => md5(microtime()),
  119. 'card_type' => 'OUT_MEMBER_CARD',
  120. 'biz_no_suffix_len' => '8',
  121. 'write_off_type' => 'qrcode',
  122. 'template_style_info' => [
  123. 'card_show_name' => $model->card_show_name,
  124. 'logo_id' => $model->logo_id,
  125. 'background_id' => $model->background_id,
  126. 'bg_color' => 'rgb(0,159,252)',
  127. // 'front_text_list_enable' => 'true',
  128. // 'feature_descriptions' => [
  129. // '特色信息,用于领卡预览',
  130. // '使用花呗卡可享受免费分期',
  131. // ],
  132. // 'slogan' => '标语权益享不停',
  133. // 'brand_name' => '品牌商名称',
  134. 'column_info_layout' => 'list', //list/grid
  135. ],
  136. ];
  137. if($model->column_info_list_point){
  138. $biz_content['column_info_list'][] = [
  139. 'code' => 'POINT',
  140. 'title' => '积分',
  141. ];
  142. $biz_content['field_rule_list'][] = [
  143. 'field_name' => 'Point',
  144. 'rule_name' => 'ASSIGN_FROM_REQUEST',
  145. 'rule_value' => 'Point',
  146. ];
  147. }
  148. if($model->column_info_list_balance){
  149. $biz_content['column_info_list'][] = [
  150. 'code' => 'BALANCE',
  151. 'title' => '余额',
  152. ];
  153. $biz_content['field_rule_list'][] = [
  154. 'field_name' => 'Balance',
  155. 'rule_name' => 'ASSIGN_FROM_REQUEST',
  156. 'rule_value' => 'Balance',
  157. ];
  158. }
  159. foreach(json_decode($model->column_info_list, true) as $i => $item){
  160. $biz_content['column_info_list'][] = [
  161. 'code' => 'column_info_list_code_' . $i,
  162. 'title' => $item['title'],
  163. 'value' => $item['value'],
  164. 'operate_type' => 'openWeb',
  165. 'more_info' => [
  166. 'title' => $item['title'],
  167. 'url' => $item['url']['link'],
  168. ],
  169. 'icon_id' => $model->logo_id,
  170. ];
  171. }
  172. foreach(json_decode($model->card_action_list, true) as $i => $item){
  173. $display_on_list = $i < 2 ? 'true' : 'false';
  174. $biz_content['card_action_list'][] = [
  175. 'code' => 'card_action_list_code_' . $i,
  176. 'text' => $item['title'],
  177. 'url_type' => 'miniAppUrl',
  178. 'mini_app_url' => [
  179. 'mini_app_id' => '2018xxxxxxx',
  180. 'mini_page_param' => $item['url']['link'],
  181. 'display_on_list' => $display_on_list,
  182. ]
  183. ];
  184. }
  185. foreach(json_decode($model->template_benefit_info, true) as $i => $item){
  186. $biz_content['template_benefit_info'][] = [
  187. 'title' => $item['title'],
  188. 'benefit_desc' => [$item['benefit_desc']],
  189. 'start_date' => '2016-07-18 15:17:23',
  190. 'end_date' => '2116-07-18 15:17:23',
  191. ];
  192. }
  193. $biz_content['open_card_conf'] = [
  194. 'open_card_source_type' => 'ISV',
  195. 'source_app_id' => '2018xxxxxxx',
  196. 'open_card_url' => 'https://www.alipay.com',
  197. ];
  198. foreach(json_decode($model->open_card_conf_card_rights, true) as $i => $item){
  199. $biz_content['open_card_conf']['card_rights'][] = [
  200. 'title' => $item['title'],
  201. 'detail' => $item['detail'],
  202. 'logo_id' => $item['logo_id'],
  203. ];
  204. }
  205. return $biz_content;
  206. }
  207. public function spi_alipay_user_opencard_get($params) {
  208. /**
  209. $_POST = [
  210. 'user_id' => '2088902351536970'
  211. 'user_info' => '[{\'OPEN_FORM_FIELD_GENDER\':\'男\'},{\'OPEN_FORM_FIELD_MOBILE\':\'13888888888\'},{\'OPEN_FORM_FIELD_NAME\':\'李四\'}]'
  212. 'out_serial_no' => '1621923366000'
  213. 'biz_card_no' => '000001'
  214. 'template_id' => '20200312000000000414103000300846'
  215. 'out_string' => 'test'
  216. ]
  217. *
  218. */
  219. $temp = AlipayCardTemp::findOne(['template_id' => $params['template_id']]);
  220. $user = User::findOne(['alipay_open_id' => $params['user_id'], 'store_id' => $temp->store_id]);
  221. $card = AlipayCard::findOne(['template_id' => $temp->template_id, 'alipay_open_id' => $params['user_id']]);
  222. \Yii::error([__METHOD__, $card, ['template_id' => $temp->template_id, 'alipay_open_id' => $params['user_id']]]);
  223. if(!$card){
  224. $card = new AlipayCard();
  225. $card->mini_id = $temp->mini_id;
  226. $card->store_id = $temp->store_id;
  227. $card->template_id = $temp->template_id;
  228. $card->alipay_open_id = $params['user_id'] ?: '';
  229. $card->biz_card_no = $params['biz_card_no'];
  230. $card->external_card_no = $params['biz_card_no'];
  231. $card->out_string = $params['out_string'] ?: '';
  232. $card->open_date = date('Y-m-d H:i:s');
  233. $card->valid_date = '2100-12-12 00:00:00';
  234. }
  235. $card->is_delete = 0;
  236. \Yii::error([__METHOD__, $params['user_info'], json_decode($params['user_info'], true)]);
  237. $user_info = json_decode($params['user_info'], true);
  238. if(json_last_error()){
  239. $params['user_info'] = str_replace("'", '"', $params['user_info']);
  240. $user_info = json_decode($params['user_info'], true);
  241. }
  242. \Yii::error([__METHOD__, $user_info]);
  243. if($user_info){
  244. foreach($user_info as $item){
  245. if(isset($item['OPEN_FORM_FIELD_MOBILE'])){
  246. $card->mobile = $item['OPEN_FORM_FIELD_MOBILE'];
  247. }
  248. if(isset($item['OPEN_FORM_FIELD_NAME'])){
  249. $card->name = $item['OPEN_FORM_FIELD_NAME'];
  250. }
  251. }
  252. }
  253. if(!$card->save()){
  254. \Yii::error([__METHOD__, $card]);
  255. return [
  256. 'code' => 1,
  257. 'msg' => array_shift($card->getFirstErrors()),
  258. ];
  259. }
  260. $res = [
  261. "response" => [
  262. "code" => "10000",
  263. "msg" => "Success",
  264. "card_info" => [
  265. "biz_card_no" => $card['biz_card_no'],
  266. "external_card_no" => $card['external_card_no'],
  267. "open_date" => $card['open_date'],
  268. "valid_date" => $card['valid_date'],
  269. "point" => $user->integral,
  270. "balance" => $user->money,
  271. "template_id" => $card['template_id'],
  272. "front_text_list" => [
  273. [
  274. "label" => "专业",
  275. "value" => "金融贸易"
  276. ]
  277. ],
  278. ],
  279. // "open_card_ext_info" => [
  280. // "is_new_member" => true,
  281. // "activity_id" => "12345"
  282. // ]
  283. ],
  284. "sign" => "ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE",
  285. ];
  286. return $res;
  287. }
  288. public function apiCardQuery($card) {
  289. $form = new AlipayThirdForm();
  290. $form->mini_id = $this->mini_id;
  291. $res = $form->AlipayMarketingCardQuery($card->biz_card_no);
  292. if($res['code'] !== 0){
  293. \Yii::error([__METHOD__, $res]);
  294. }
  295. return $res;
  296. }
  297. public function cardInfoByUser($user) {
  298. $card = AlipayCard::findOne(['alipay_open_id' => $user['alipay_open_id'], 'store_id' => $this->store_id, 'mini_id' => $this->mini_id]);
  299. $apires = $this->apiCardQuery($card);
  300. return [
  301. 'code' => 0,
  302. 'msg' => 'ok',
  303. 'card' => $card,
  304. 'apires' => $apires,
  305. ];
  306. }
  307. public function cardList($params = []) {
  308. $query = AlipayCard::find()->where(['is_delete' => 0, 'store_id' => $this->store_id]);
  309. $this->mini_id && $query->andWhere(['mini_id' => $this->mini_id]);
  310. $params['name'] && $query->andWhere(['name' => $params['name']]);
  311. $params['mobile'] && $query->andWhere(['mobile' => $params['mobile']]);
  312. if($params['nickname']){
  313. $userQuery = (new Query())->select('alipay_open_id')->from(User::tableName())->where(['store_id' => $this->store_id])->andWhere(['like', 'nickname', $params['nickname']]);
  314. $query->andWhere(['alipay_open_id' => $userQuery]);
  315. }
  316. $list = pagination_make($query);
  317. foreach ($list['list'] as &$item) {
  318. $user = User::findOne(['alipay_open_id' => $item['alipay_open_id'], 'store_id' => $this->store_id]);
  319. $item['user'] = $user;
  320. $item['point'] = $user->integral;
  321. $item['balance'] = $user->money;
  322. }
  323. return [
  324. 'code' => 0,
  325. 'msg' => 'ok',
  326. 'data' => $list,
  327. // 'sql' => $query->createCommand()->getRawSql(),
  328. ];
  329. }
  330. //更新积分、余额
  331. public function cardUpdate($id) {
  332. $card = AlipayCard::findOne($id);
  333. $user = User::findOne(['alipay_open_id' => $card['alipay_open_id'], 'store_id' => $card['store_id']]);
  334. if(!$user){
  335. return [
  336. 'code' => 0,
  337. 'msg' => '无需同步,没有查到系统会员信息',
  338. ];
  339. }
  340. $form = new AlipayThirdForm();
  341. $form->mini_id = $this->mini_id;
  342. $card_info = [
  343. 'biz_card_no' => $card->biz_card_no,
  344. 'external_card_no' => $card->external_card_no,
  345. 'open_date' => $card->open_date,
  346. 'valid_date' => $card->valid_date,
  347. 'point' => $user->integral,
  348. 'balance' => $user->money,
  349. 'template_id' => $card->template_id,
  350. ];
  351. $res = $form->AlipayMarketingCardUpdate($card->biz_card_no, $card_info);
  352. if($res['code'] !== 0){
  353. \Yii::error([__METHOD__, $res]);
  354. }
  355. return $res;
  356. }
  357. public function cardUpdateByOpenid($openid) {
  358. try{
  359. $card = AlipayCard::findOne(['alipay_open_id' => $openid, 'store_id' => $this->store_id]);
  360. if(!$card){
  361. return;
  362. }
  363. $this->mini_id = $card->mini_id;
  364. return $this->cardUpdate($card->id);
  365. } catch (\Exception $e) {
  366. \Yii::error([__METHOD__, $e]);
  367. }
  368. }
  369. public function cardDel($id) {
  370. $card = AlipayCard::findOne($id);
  371. $card->is_delete = 1;
  372. if(!$card->save()){
  373. \Yii::error([__METHOD__, $card]);
  374. return [
  375. 'code' => 1,
  376. 'msg' => array_shift($card->getFirstErrors()),
  377. ];
  378. }
  379. $form = new AlipayThirdForm();
  380. $form->mini_id = $this->mini_id;
  381. $res = $form->AlipayMarketingCardDelete($card->biz_card_no);
  382. if($res['code'] !== 0){
  383. \Yii::error([__METHOD__, $res]);
  384. }
  385. return $res;
  386. }
  387. }