Adapay.php 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\utils\Adapay;
  8. use app\models\Option;
  9. use app\constants\OptionSetting;
  10. use app\models\LevelOrder;
  11. use app\models\Order;
  12. use app\models\OrderUnion;
  13. use app\models\ReOrder;
  14. use app\models\SaasUser;
  15. use app\models\Store;
  16. use app\models\WechatConfig;
  17. use app\modules\client\models\v1\OpenidForm;
  18. use app\utils\DataTransform;
  19. use app\utils\OrderNo;
  20. use EasyWeChat\Kernel\Exceptions\Exception;
  21. use GuzzleHttp\Exception\GuzzleException;
  22. use yii\base\BaseObject;
  23. use function GuzzleHttp\Psr7\str;
  24. use app\models\DeliveryInfo;
  25. use app\models\AccountLog;
  26. use app\modules\admin\models\SaasForm;
  27. use app\models\SaasDistribution;
  28. include_once \Yii::$app->basePath . "/utils/Adapay/AdapaySdk/init.php";
  29. class Adapay
  30. {
  31. public static $notify_url = 'adapay/notify';
  32. public static $confs = [];
  33. public static function conf($store_id = 0, $refresh = 0) {
  34. if(isset(self::$confs[$store_id]) && !$refresh){
  35. return self::$confs[$store_id];
  36. }
  37. $confDef = [
  38. "api_key_live" => "",
  39. "rsa_private_key" => "",
  40. "app_id" => "",
  41. "v2" => [
  42. "sys_id" => "",
  43. "product_id" => "",
  44. "huifu_id" => '',
  45. "rsa_huifu_public_key" => "",
  46. "rsa_merch_private_key" => "",
  47. ]
  48. ];
  49. $conf = Option::get(OptionSetting::ADAPAY, $store_id, 'store')['value'];
  50. if($conf){
  51. $conf = array_merge($confDef, json_decode($conf, true));
  52. }else{
  53. $conf = $confDef;
  54. }
  55. self::$confs[$store_id] = $conf;
  56. return $conf;
  57. }
  58. public static function saveConf($store_id = 0, $config = []) {
  59. $oldConf = self::conf($store_id, 1);
  60. $conf = array_merge($oldConf, $config);
  61. $set = Option::set(OptionSetting::ADAPAY, json_encode($conf), $store_id, 'store');
  62. self::conf($store_id, 1);
  63. return $set;
  64. }
  65. public static function initStoreAdapay($store_id) {
  66. $conf = self::conf($store_id);
  67. \AdaPay\AdaPay::init([
  68. "api_key_live" => $conf['api_key_live'],
  69. "rsa_private_key" => $conf['rsa_private_key'],
  70. ], "live", true);
  71. }
  72. public static function create($pay_type, $order, $type, $goods_names = null, $total_pay_price = 0, $is_app = false, $balance_price = 0, $is_h5 = false, $is_official = false) {
  73. if (!$order || !in_array($type, OrderNo::$validOrderType) || ($type != OrderNo::ORDER_UNION && !$goods_names)) {
  74. return [
  75. 'code' => 1,
  76. 'msg' => '订单信息或订单类型错误'
  77. ];
  78. }
  79. // \AdaPay\AdaPay::init([
  80. // "api_key_live" => "api_live_2fdb32b6-2807-4d4a-99f7-fc0a9b3c8fa5",
  81. // "api_key_test" => "api_test_46be6a5e-c047-4cd0-9aac-c8c73a332f51",
  82. //// "rsa_public_key" => "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCS0Fpi540Y5pPtItiRrsnguG8N22mwbNcHaA+ZfqDxEM32bNoLp7VhV/4T9jUS8plSYkH3kr7xmWl311f0qxEz5S4LbQACN/vDag48zsY2iTulhnCdpbhFqqCVnuK86g7uFyGhy9PJwGscXpmLxXkA1jwEFXM+8NTjfD8YsEdF0QIDAQAB",
  83. // "rsa_private_key" => "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJLQWmLnjRjmk+0i2JGuyeC4bw3babBs1wdoD5l+oPEQzfZs2guntWFX/hP2NRLymVJiQfeSvvGZaXfXV/SrETPlLgttAAI3+8NqDjzOxjaJO6WGcJ2luEWqoJWe4rzqDu4XIaHL08nAaxxemYvFeQDWPAQVcz7w1ON8PxiwR0XRAgMBAAECgYEAgg4gg80rqQtZr5BW2XdFTtUTS+s6zRcdxWnhp9ANMn/4dHwpDHocq4cPhQ9uJMLUH677UR2mGNAWJhuVxyBjs4J2qVFACpU4Ta9BRQXCppao3maB+04Uobik0xObAz6Fj+EitfO3HFrV6ilPtEMtiObd25uS/aQF7tLKgC+rs4ECQQDeTQyAtmWG+5Iacz1uIxLBWIyz5uIwdRb8pAcA/XIR/alv0IOEhPmYTq/6234av6CP9tWl65vOjozBY5D7RbDNAkEAqRHWNu0Zyw6koY6Pu3mivABanY0lZHigdSmxwAQqB8HnUXpuSscj5N1KxlTVvcPw40pbKOCrUoRXib9Cu3rZFQJAZdBkKY9gcLJH+FVPjWIC9QrZZowYjJkULiHyE0IBPLwxHkUh90/wARIJB5v/5cBeiZFDyPpgIfqn/OrdPDhvAQJAUd8JVN/MNcCJiJJ4l9h3LYMeXl0TVmvzh8kBAnMBx2/mjFY1QpDcmN9wbkp2lsZjyC0hp9HkJLlhiprLve3nYQJBAJZ8XdINDo+P9YJLEwMn1OrDG8h071YijgvAvHpZWxb+7GbUhExkDUVaT99jjLzGZ8mVvvTJ/VoqnFu4+ALyAjE=",
  84. // ], "live", true);
  85. // $app_id = 'app_9aa823b9-d959-4307-a931-23ba8780f9aa';
  86. // $open_id = 'oNiCd4gweWf2Irg2K5WfTFWFGEts';
  87. $store_id = $order->store_id;
  88. self::initStoreAdapay($store_id);
  89. $conf = self::conf($store_id);
  90. $app_id = $conf['app_id'];
  91. if($pay_type == Order::PAY_TYPE_ADAPAY_WX){
  92. if ($is_app) {
  93. $open_id = get_user()->wechat_app_open_id;
  94. } else if ($is_official) {
  95. $open_id = get_user()->wechat_platform_open_id;
  96. } else {
  97. $open_id = get_user()->wechat_open_id;
  98. }
  99. $expend = ['open_id' => $open_id];
  100. }
  101. if($pay_type == Order::PAY_TYPE_ADAPAY_ALIPAY){
  102. $open_id = get_user()->alipay_open_id;
  103. $expend = ['buyer_id' => $open_id];
  104. }
  105. if ($type == OrderNo::ORDER_UNION) {
  106. $goods_title = count($order) . '笔订单合并支付';
  107. $out_trade_no = OrderNo::getOrderNo(OrderNo::ORDER_UNION);
  108. $total_fee = $balance_price > 0 ? floatval($total_pay_price - $balance_price) * 100 : $total_pay_price * 100;
  109. $order_union = new OrderUnion();
  110. $order_union->store_id = get_store_id();
  111. $order_union->user_id = get_user()->id;
  112. $order_union->order_no = $out_trade_no;
  113. $order_union->price = $total_pay_price;
  114. $order_union->is_pay = 0;
  115. $order_union->created_at = time();
  116. $order_union->is_delete = 0;
  117. $order_id_list = [];
  118. foreach ($order as $value) {
  119. $order_id_list[] = $value->id;
  120. }
  121. $order_union->order_id_list = json_encode($order_id_list);
  122. if (!$order_union->save()) {
  123. foreach ($order_union->errors as $error) {
  124. return [
  125. 'code' => 1,
  126. 'msg' => $error
  127. ];
  128. }
  129. }
  130. } else {
  131. $pay_price = $order->pay_price;
  132. // if ($type != OrderNo::ORDER_RECHARGE) {
  133. // if (isset($order->is_delivery) && $order->is_delivery == 1) {
  134. // $deliveryInfo = DeliveryInfo::find()->where(['order_no' => $order->order_no])->one();
  135. // if ($deliveryInfo) {
  136. // $pay_price += $deliveryInfo->fee;
  137. // }
  138. // }
  139. // }
  140. $goods_title = mb_substr($goods_names, 0, 20);
  141. $out_trade_no = $order->order_no;
  142. $total_fee = $balance_price > 0 ? floatval($pay_price - $balance_price) * 100 : $pay_price * 100;
  143. }
  144. if($pay_type == Order::PAY_TYPE_ADAPAY_WX){
  145. if ($is_h5) {
  146. $pay_channel = 'wx_pub';
  147. } else {
  148. $pay_channel = 'wx_lite';
  149. }
  150. }
  151. if($pay_type == Order::PAY_TYPE_ADAPAY_ALIPAY){
  152. $pay_channel = 'alipay_lite';
  153. }
  154. // 是否走分账
  155. $pay_mode = '';
  156. if (is_profit_sharing()) {
  157. $pay_mode = 'delay';
  158. }
  159. //强制走分账流程,减少判断逻辑
  160. $pay_mode = 'delay';
  161. # 初始化支付类
  162. $payment = new \AdaPaySdk\Payment();
  163. if($order->adapay_payment_id){
  164. ob_start();
  165. $payment->query(['payment_id' => $order->adapay_payment_id]);
  166. $ob_cont = ob_get_contents();
  167. var_dump(['2', $ob_cont]);
  168. ob_end_clean();
  169. debug_log([__METHOD__, __LINE__, $payment->result], __CLASS__ . '.log');
  170. if ($payment->isError()){
  171. return [
  172. 'code' => 1,
  173. 'msg' => '支付失败,查询失败',
  174. ];
  175. } else {
  176. if(in_array($payment->result['status'], ['succeeded'])){
  177. return [
  178. 'code' => 1,
  179. 'msg' => '支付状态异常',
  180. ];
  181. }
  182. if($payment->result['order_no'] == $out_trade_no){
  183. $out_trade_no = OrderNo::getOrderNo($type);
  184. $order->order_no = $out_trade_no;
  185. $order->save();
  186. }
  187. }
  188. }
  189. # 支付设置
  190. $payment_params = array(
  191. "app_id"=> $app_id,
  192. "order_no"=> $out_trade_no,
  193. "pay_channel"=> $pay_channel, //"wx_lite",
  194. // "time_expire"=> "20200101000000",
  195. "pay_amt"=> sprintf("%.2f", $total_fee/100),
  196. "goods_title"=> $goods_title,
  197. "goods_desc"=> $goods_title,
  198. // "description"=> "description",
  199. "pay_mode"=> $pay_mode,
  200. 'expend' => $expend,
  201. 'notify_url' => pay_notify_url(self::$notify_url),
  202. );
  203. # 发起支付
  204. ob_start();
  205. $payment->create($payment_params);
  206. $ob_cont = ob_get_contents();
  207. var_dump(['2', $ob_cont]);
  208. ob_end_clean();
  209. # 对支付结果进行处理
  210. if ($payment->isError()){
  211. //失败处理
  212. debug_log([__METHOD__, __LINE__, $payment->result], __CLASS__ . '.log');
  213. return [
  214. 'code' => 1,
  215. 'msg' => '支付失败,' . (isset($payment->result['error_msg']) ? $payment->result['error_msg'] : ''),
  216. 'res' => $payment->result,
  217. ];
  218. } else {
  219. $data = json_decode($payment->result['expend']['pay_info'], true);
  220. if($data === null){
  221. $data = $payment->result['expend']['pay_info'];
  222. }
  223. if($pay_channel == 'alipay_lite'){
  224. $data = $data['tradeNO'];
  225. }
  226. //成功处理
  227. $return = [
  228. 'code' => 0,
  229. 'msg' => 'success',
  230. 'res' => $payment->result,
  231. 'data' => $data,
  232. ];
  233. if ($type == OrderNo::ORDER_UNION) {
  234. foreach ($order as $value) {
  235. $value->order_union_id = $value->id;
  236. $value->adapay_payment_id = $payment->result['id'];
  237. $value->save();
  238. }
  239. $return['order_no'] = $payment_params['out_trade_no'];
  240. $return['body'] = $payment_params['goods_title'];
  241. }else{
  242. $order->adapay_payment_id = $payment->result['id'];
  243. $order->save();
  244. }
  245. if ($is_h5) {
  246. $return['res']['mweb_url'] = $return['res']['mweb_url'] . '&redirect_url=' . \Yii::$app->request->hostInfo . '/h5/#/order/order/order';
  247. }
  248. return $return;
  249. }
  250. }
  251. public static function paymentConfirmCreate($order, $member_id, $amount) {
  252. $store_id = $order->store_id;
  253. self::initStoreAdapay($store_id);
  254. $adapay_payment_id = self::getOrderPaymentId($order);
  255. if($adapay_payment_id['code'] != 0){
  256. return $adapay_payment_id;
  257. }
  258. # 初始化支付类
  259. $payment = new \AdaPaySdk\PaymentConfirm();
  260. # 支付确认参数设置
  261. $payment_params = array(
  262. "payment_id"=> $adapay_payment_id['data'],
  263. "order_no"=> $order->order_no . '_' . time() . random_int(100000, 999999),
  264. "confirm_amt"=> sprintf("%.2f", $amount),
  265. "description"=> "分账",
  266. "div_members"=> [
  267. [
  268. 'member_id' => $member_id,
  269. 'amount' => sprintf("%.2f", $amount),
  270. 'fee_flag' => 'Y',
  271. ]
  272. ]
  273. );
  274. # 发起支付确认创建
  275. $payment->create($payment_params);
  276. # 对支付确认创建结果进行处理
  277. if ($payment->isError()){
  278. //失败处理
  279. debug_log([__METHOD__, __LINE__, $payment->result, $payment_params], __CLASS__ . '.log');
  280. return [
  281. 'code' => 1,
  282. 'msg' => 'adapay分账失败1,' . (isset($payment->result['error_msg']) ? $payment->result['error_msg'] : ''),
  283. 'res' => $payment->result,
  284. ];
  285. } else {
  286. //成功处理
  287. // var_dump($payment->result);
  288. return [
  289. 'code' => 0,
  290. 'msg' => 'success',
  291. 'data' => $payment->result,
  292. ];
  293. }
  294. }
  295. public static function paymentConfirmQueryList($order, $page = 1) {
  296. $store_id = $order->store_id;
  297. self::initStoreAdapay($store_id);
  298. $conf = self::conf($store_id);
  299. $app_id = $conf['app_id'];
  300. $adapay_payment_id = self::getOrderPaymentId($order);
  301. if($adapay_payment_id['code'] != 0){
  302. return $adapay_payment_id;
  303. }
  304. # 初始化支付类
  305. $payment = new \AdaPaySdk\PaymentConfirm();
  306. # 支付确认参数设置
  307. $payment_params = array(
  308. "app_id"=> $app_id,
  309. "payment_id"=> $adapay_payment_id['data'],
  310. "page_index"=> $page,
  311. "page_size"=> 20,
  312. );
  313. # 发起支付确认创建
  314. $payment->queryList($payment_params);
  315. # 对支付确认创建结果进行处理
  316. if ($payment->isError()){
  317. //失败处理
  318. debug_log([__METHOD__, __LINE__, $payment->result, $payment_params], __CLASS__ . '.log');
  319. return [
  320. 'code' => 1,
  321. 'msg' => 'adapay查询支付确认对象列表失败1,' . (isset($payment->result['error_msg']) ? $payment->result['error_msg'] : ''),
  322. 'res' => $payment->result,
  323. ];
  324. } else {
  325. //成功处理
  326. // var_dump($payment->result);
  327. return [
  328. 'code' => 0,
  329. 'msg' => 'success',
  330. 'data' => $payment->result,
  331. ];
  332. }
  333. }
  334. public static function query($store_id, $page_size = 10, $page_index = 1, $order_no = '', $payment_id = '') {
  335. self::initStoreAdapay($store_id);
  336. $conf = self::conf($store_id);
  337. $app_id = $conf['app_id'];
  338. # 初始化支付类
  339. $payment = new \AdaPaySdk\Payment();
  340. # 请求参数
  341. $payment_params = array(
  342. "app_id"=> $app_id,
  343. "payment_id"=> $payment_id,
  344. "order_no"=> $order_no,
  345. "page_index"=> $page_index,
  346. "page_size"=> $page_size,
  347. "created_gte"=> "",
  348. "created_lte"=> ""
  349. );
  350. $payment->queryList($payment_params);
  351. # 对支付结果进行处理
  352. if ($payment->isError()){
  353. //失败处理
  354. return [
  355. 'code' => 1,
  356. 'msg' => '查询订单失败1,' . (isset($payment->result['error_msg']) ? $payment->result['error_msg'] : ''),
  357. 'res' => $payment->result,
  358. ];
  359. } else {
  360. //成功处理
  361. // var_dump($payment->result);
  362. return [
  363. 'code' => 0,
  364. 'msg' => 'success',
  365. 'data' => $payment->result,
  366. ];
  367. }
  368. }
  369. public static function orderNo2Id($store_id, $order_no = '') {
  370. $data = self::query($store_id, 1, 1, $order_no);
  371. if($data['code'] != 0){
  372. return $data;
  373. }
  374. if(!empty($data['data']['payments'])){
  375. $id = $data['data']['payments'][0]['id'];
  376. return [
  377. 'code' => 0,
  378. 'data' => $id,
  379. ];
  380. }
  381. return [
  382. 'code' => 1,
  383. 'msg' => '未查询到数据',
  384. ];
  385. }
  386. public static function paymentReverse($order, $reverse_amt) {
  387. $store_id = $order->store_id;
  388. self::initStoreAdapay($store_id);
  389. $conf = self::conf($store_id);
  390. $app_id = $conf['app_id'];
  391. $adapay_payment_id = self::getOrderPaymentId($order);
  392. if($adapay_payment_id['code'] != 0){
  393. return $adapay_payment_id;
  394. }
  395. # 初始化支付类
  396. $payment = new \AdaPaySdk\PaymentReverse();
  397. $payment_params = array(
  398. # 支付对象ID
  399. "payment_id"=> $adapay_payment_id['data'],
  400. # 商户app_id
  401. "app_id"=> $app_id,
  402. # 撤销订单号
  403. "order_no"=> $order->order_no . "R" . time() .rand(100000, 999999),
  404. # 撤销金额
  405. "reverse_amt"=> sprintf("%.2f", $reverse_amt),
  406. # 通知地址
  407. "notify_url"=> "",
  408. # 撤销原因
  409. "reason"=> "撤销",
  410. # 扩展域
  411. "expand"=> "",
  412. # 设备信息
  413. "device_info"=> "",
  414. );
  415. # 发起支付撤销
  416. $payment->create($payment_params);
  417. # 对支付撤销结果进行处理
  418. if ($payment->isError()){
  419. //失败处理
  420. debug_log([__METHOD__, __LINE__, $payment->result, $payment_params], __CLASS__ . '.log');
  421. return [
  422. 'code' => 1,
  423. 'msg' => '撤销失败1,' . (isset($payment->result['error_msg']) ? $payment->result['error_msg'] : ''),
  424. 'res' => $payment->result,
  425. ];
  426. } else {
  427. //成功处理
  428. // var_dump($payment->result);
  429. return [
  430. 'code' => 0,
  431. 'msg' => 'success',
  432. 'data' => $payment->result,
  433. ];
  434. }
  435. }
  436. /**
  437. * 退款
  438. * @param Object $order
  439. * @param string $orderRefundNo
  440. * @param string $type
  441. * @param integer $refundFee
  442. * @param $refund_account
  443. * @return array
  444. */
  445. public static function orderRefund($order, $type, $refundFee, $orderRefundNo, $refund_account = null, $profit_share = 1) {
  446. if(in_array($order->pay_type, [Order::PAY_TYPE_ADAPAY_QUICKPAY_FRONTPAY, Order::PAY_TYPE_HUIFU_V2_JSPAY_WX])){
  447. return AdapayV2::orderRefund($order, $type, $refundFee, $orderRefundNo, $refund_account, $profit_share);
  448. }
  449. if($profit_share){
  450. $confirmList = self::paymentConfirmQueryList($order, 1);
  451. if($confirmList['code'] != 0){
  452. return $confirmList;
  453. }
  454. if(!empty($confirmList['data']['payment_confirms'])){
  455. return [
  456. 'code' => 1,
  457. 'msg' => '已经分账,无法退款',
  458. ];
  459. }else{
  460. return self::paymentReverse($order, $refundFee);
  461. }
  462. }
  463. $adapay_payment_id = self::getOrderPaymentId($order);
  464. if($adapay_payment_id['code'] != 0){
  465. return $adapay_payment_id;
  466. }
  467. $store_id = $order->store_id;
  468. self::initStoreAdapay($store_id);
  469. #初始化退款对象
  470. $refund = new \AdaPaySdk\refund();
  471. $refund_params = array(
  472. # 原交易支付对象ID
  473. "payment_id"=> $adapay_payment_id['data'],
  474. # 退款订单号
  475. "refund_order_no"=> $orderRefundNo,
  476. # 退款金额
  477. "refund_amt"=> sprintf("%.2f", $refundFee),
  478. # 退款描述
  479. "reason"=> "退款",
  480. # 扩展域
  481. "expend"=> "",
  482. # 设备静态信息
  483. "device_info"=> "",
  484. 'notify_url' => pay_notify_url(self::$notify_url),
  485. );
  486. # 发起退款
  487. $refund->create($refund_params);
  488. # 对退款结果进行处理
  489. # $refund->result 类型为数组
  490. if ($refund->isError()){
  491. //失败处理
  492. debug_log([__METHOD__, __LINE__, $refund->result, $refund_params], __CLASS__ . '.log');
  493. return [
  494. 'code' => 1,
  495. 'msg' => '退款失败1,' . (isset($refund->result['error_msg']) ? $refund->result['error_msg'] : ''),
  496. 'res' => $refund->result,
  497. ];
  498. } else {
  499. //成功处理
  500. // var_dump($refund->result);
  501. }
  502. // 联合支付,退余额
  503. if ($order->is_combine_pay == 1 && $order->combine_money > 0) {
  504. AccountLog::saveLog($order->user_id, $order->combine_money, AccountLog::TYPE_BALANCE, AccountLog::LOG_TYPE_INCOME, AccountLog::TYPE_PLATFORM_REFUND_ORDER, $order->id, "商城订单退款,订单号:{$order->order_no}");
  505. }
  506. return [
  507. 'code' => 0,
  508. 'msg' => 'success',
  509. 'data' => $refund->result,
  510. ];
  511. }
  512. public static function shareToSelf($order) {
  513. $store_id = $order->store_id;
  514. $adapay_payment_id = self::getOrderPaymentId($order);
  515. if($adapay_payment_id['code'] != 0){
  516. return $adapay_payment_id;
  517. }
  518. $adapay_payment_id = $adapay_payment_id['data'];
  519. $data = self::query($store_id, 1, 1, '', $adapay_payment_id);
  520. if($data['code'] != 0){
  521. return $data;
  522. }
  523. if(!empty($data['data']['payments']) && ($data['data']['payments'][0]['status'] === 'failed')){
  524. debug_log([__METHOD__, __LINE__, '支付失败,无需分账', $adapay_payment_id, $store_id], __CLASS__ . '.log');
  525. return [
  526. 'code' => 0,
  527. 'msg' => '支付失败,无需分账',
  528. ];
  529. }
  530. $confirmList = self::paymentConfirmQueryList($order, 1);
  531. if($confirmList['code'] != 0){
  532. return $confirmList;
  533. }
  534. $amount = $order->pay_price;
  535. if($confirmList['data']['payment_confirms']){
  536. $amount -= $confirmList['data']['payment_confirms'][0]['confirmed_amt'];
  537. }
  538. if($amount <= 0){
  539. return [
  540. 'code' => 0,
  541. 'msg' => '分账已完结',
  542. ];
  543. }
  544. $member_id = 0;
  545. $share = self::paymentConfirmCreate($order, $member_id, $amount);
  546. return $share;
  547. }
  548. public static function shareToStore($order, $receivers_share) {
  549. $store_id = $order['store_id'];
  550. $addRec = self::addReceiversStore($store_id, $receivers_share['to_store_id']);
  551. if($addRec['code'] != 0){
  552. return $addRec;
  553. }
  554. $member_id = self::getMemberId(0, $receivers_share['to_store_id']);
  555. $amount = $receivers_share['amount'];
  556. return self::paymentConfirmCreate($order, $member_id, $amount);
  557. }
  558. public static function shareToSaas($order, $receivers_share) {
  559. $store_id = $order['store_id'];
  560. $addRec = self::addReceiversSaas($store_id);
  561. if($addRec['code'] != 0){
  562. return $addRec;
  563. }
  564. $member_id = self::getMemberId(0, 0, 1);
  565. $amount = $receivers_share['amount'];
  566. return self::paymentConfirmCreate($order, $member_id, $amount);
  567. }
  568. public static function share($order, $receivers_share) {
  569. if($receivers_share['to_store_id']){
  570. return self::shareToStore($order, $receivers_share);
  571. }
  572. if($receivers_share['type'] == 2 && empty($receivers_share['to_store_id'])){
  573. return self::shareToSaas($order, $receivers_share);
  574. }
  575. $store_id = $order['store_id'];
  576. $addRec = self::addReceiversStoreUser($store_id, $receivers_share['user_id'], $receivers_share['saas_id']);
  577. if($addRec['code'] != 0){
  578. return $addRec;
  579. }
  580. $member_id = self::getMemberId($receivers_share['user_id'], 0, 0, $receivers_share['saas_id']);
  581. $amount = $receivers_share['amount'];
  582. return self::paymentConfirmCreate($order, $member_id, $amount);
  583. }
  584. public static function addReceiversStoreUser($store_id, $user_id = 0, $saas_user_id = 0) {
  585. $memberCreate = self::memberCreate($store_id, $user_id, 0, 0, $saas_user_id);
  586. if($memberCreate['code'] != 0){
  587. return $memberCreate;
  588. }
  589. return self::settleAccountCreate($store_id, $user_id, 0, 0, $saas_user_id);
  590. }
  591. public static function addReceiversStore($store_id, $m_store_id) {
  592. $memberCreate = self::memberCreate($store_id, 0, $m_store_id);
  593. if($memberCreate['code'] != 0){
  594. return $memberCreate;
  595. }
  596. return self::settleAccountCreate($store_id, 0, $m_store_id);
  597. }
  598. public static function addReceiversSaas($store_id) {
  599. $memberCreate = self::memberCreate($store_id, 0, 0, 1);
  600. if($memberCreate['code'] != 0){
  601. return $memberCreate;
  602. }
  603. return self::settleAccountCreate($store_id, 0, 0, 1);
  604. }
  605. public static function setReceiverStore($store_id, $data) {
  606. $v = Option::set(OptionSetting::ADAPAY_RECEIVER, json_encode(array_merge([self::getReceiverStore($store_id), $data])), $store_id, 'store');
  607. return json_decode($v, true);
  608. }
  609. public static function setReceiverSaas($data) {
  610. $v = Option::set(OptionSetting::ADAPAY_RECEIVER, json_encode(array_merge([self::getReceiverSaas(), $data])), 0, 'saas');
  611. return json_decode($v, true);
  612. }
  613. public static function getReceiverStore($store_id) {
  614. $v = Option::get(OptionSetting::ADAPAY_RECEIVER, $store_id, 'store', '{}')['value'];
  615. return json_decode($v, true);
  616. }
  617. public static function getReceiverSaas() {
  618. $v = Option::get(OptionSetting::ADAPAY_RECEIVER, 0, 'saas', '{}')['value'];
  619. return json_decode($v, true);
  620. }
  621. public static function getMemberId($user_id = 0, $m_store_id = 0, $is_saas = 0, $saas_user_id = 0) {
  622. if($user_id || $saas_user_id){
  623. if($saas_user_id){
  624. $member_id = $saas_user_id;
  625. }else{
  626. $user = \app\models\User::findOne($user_id);
  627. $saas_user = SaasUser::findOne(['mobile' => $user->binding]);
  628. $member_id = $saas_user->id;
  629. }
  630. }
  631. if($m_store_id){
  632. $member_id = 'store_id_' . $m_store_id;
  633. }
  634. if($is_saas){
  635. $member_id = 'saas';
  636. }
  637. return $member_id;
  638. }
  639. public static function memberCreate($store_id, $user_id = 0, $m_store_id = 0, $is_saas = 0, $saas_user_id = 0) {
  640. $member_id = self::getMemberId($user_id, $m_store_id, $is_saas, $saas_user_id);
  641. self::initStoreAdapay($store_id);
  642. $conf = self::conf($store_id);
  643. $app_id = $conf['app_id'];
  644. $member = new \AdaPaySdk\Member();
  645. # 查询用户对象
  646. $member->query(["app_id"=> $app_id, "member_id"=> $member_id]);
  647. # 对查询用户对象结果进行处理
  648. if ($member->isError()){
  649. //失败处理
  650. } else {
  651. //成功处理
  652. return [
  653. 'code' => 0,
  654. 'msg' => 'success',
  655. 'data' => $member->result,
  656. ];
  657. }
  658. $member_params = array(
  659. # app_id
  660. "app_id"=> $app_id,
  661. # 用户id
  662. "member_id"=> $member_id,
  663. );
  664. # 创建
  665. $member->create($member_params);
  666. # 对创建用户对象结果进行处理
  667. if ($member->isError()){
  668. //失败处理
  669. debug_log([__METHOD__, __LINE__, $member->result, $member_params, $store_id], __CLASS__ . '.log');
  670. return [
  671. 'code' => 1,
  672. 'msg' => 'adapay创建用户对象失败1,' . (isset($member->result['error_msg']) ? $member->result['error_msg'] : ''),
  673. 'res' => $member->result,
  674. ];
  675. } else {
  676. //成功处理
  677. return [
  678. 'code' => 0,
  679. 'msg' => 'success',
  680. 'data' => $member->result,
  681. ];
  682. }
  683. }
  684. public static function setBankInfo($user_id = 0, $m_store_id = 0, $is_saas = 0, $saas_user_id = 0, $adapay_settle_account_id = '') {
  685. return self::getBankInfo($user_id, $m_store_id, $is_saas, $saas_user_id, $adapay_settle_account_id);
  686. }
  687. public static function getBankInfo($user_id = 0, $m_store_id = 0, $is_saas = 0, $saas_user_id = 0, $adapay_settle_account_id = '') {
  688. if($user_id || $saas_user_id){
  689. $distributionInfo = SaasDistribution::findOne(['saas_id'=>$saas_user_id]);
  690. if($distributionInfo){
  691. $bank = json_decode($distributionInfo->bank, true);
  692. if($adapay_settle_account_id){
  693. $bank['adapay_settle_account_id'] = $adapay_settle_account_id;
  694. $distributionInfo->bank = json_encode($bank);
  695. return $distributionInfo->save();
  696. }
  697. if($bank){
  698. return [
  699. 'code' => 0,
  700. 'data' => $bank,
  701. ];
  702. }
  703. }
  704. if($saas_user_id){
  705. $saas_user = SaasUser::findOne($saas_user_id);
  706. }else{
  707. $user = \app\models\User::findOne($user_id);
  708. $saas_user = SaasUser::findOne(['mobile' => $user->binding]);
  709. }
  710. if (!empty($saas_user->withdraw_method)) {
  711. $decode = json_decode($saas_user->withdraw_method, true);
  712. if (is_array($decode)) {
  713. $cash_method = $decode;
  714. }
  715. }
  716. if($cash_method && in_array('bank_card', array_column($cash_method, 'type'))){
  717. foreach ($cash_method as $i => $value) {
  718. if ($value['type'] == 'bank_card') {
  719. if($adapay_settle_account_id){
  720. $cash_method[$i]['adapay_settle_account_id'] = $adapay_settle_account_id;
  721. $saas_user->withdraw_method = json_encode($cash_method);
  722. return $saas_user->save();
  723. }
  724. $bank_card = $value;
  725. break;
  726. }
  727. }
  728. if($bank_card){
  729. $data = [
  730. "card_id" => $bank_card['account'],
  731. "card_name" => $bank_card['name'],
  732. "cert_id" => $bank_card['card_no'],
  733. "cert_type" => "00",
  734. "tel_no" => $saas_user->mobile,
  735. "bank_acct_type" => "2",
  736. ];
  737. return [
  738. 'code' => 0,
  739. 'data' => $data,
  740. ];
  741. }
  742. }
  743. }
  744. if($m_store_id){
  745. $bank_card = SaasForm::bankSetting(0, $m_store_id);
  746. if($bank_card){
  747. if($adapay_settle_account_id){
  748. return SaasForm::bankSettingSave(0, $m_store_id, ['adapay_settle_account_id' => $adapay_settle_account_id]);
  749. }
  750. return [
  751. 'code' => 0,
  752. 'data' => $bank_card,
  753. ];
  754. }
  755. }
  756. if($is_saas){
  757. $bank_card = SaasForm::bankSetting(1);
  758. if($bank_card){
  759. if($adapay_settle_account_id){
  760. return SaasForm::bankSettingSave(1, 0, ['adapay_settle_account_id' => $adapay_settle_account_id]);
  761. }
  762. return [
  763. 'code' => 0,
  764. 'data' => $bank_card,
  765. ];
  766. }
  767. }
  768. debug_log([__METHOD__, __LINE__, '提现方式银行卡信息不存在'], __CLASS__ . '.log');
  769. return [
  770. 'code' => 1,
  771. 'msg' => '提现方式银行卡信息不存在',
  772. ];
  773. }
  774. public static function settleAccountCreate($store_id, $user_id = 0, $m_store_id = 0, $is_saas = 0, $saas_user_id = 0) {
  775. $memberId = self::getMemberId($user_id, $m_store_id, $is_saas, $saas_user_id);
  776. self::initStoreAdapay($store_id);
  777. $conf = self::conf($store_id);
  778. $app_id = $conf['app_id'];
  779. $account = new \AdaPaySdk\SettleAccount();
  780. $bank_card = self::getBankInfo($user_id, $m_store_id, $is_saas, $saas_user_id);
  781. if($bank_card['code'] != 0){
  782. return $bank_card;
  783. }
  784. $account_params = array(
  785. "app_id"=> $app_id,
  786. "member_id"=> $memberId,
  787. "channel"=> "bank_account",
  788. "account_info"=> $bank_card['data'],
  789. );
  790. $member = new \AdaPaySdk\Member();
  791. $member->query(["app_id"=> $app_id, "member_id"=> $memberId]);
  792. # 对查询用户对象结果进行处理
  793. if ($member->isError()){
  794. //失败处理
  795. debug_log([__METHOD__, __LINE__, $member->result], __CLASS__ . '.log');
  796. return [
  797. 'code' => 1,
  798. 'msg' => 'adapay用户对象不存在1,' . (isset($member->result['error_msg']) ? $member->result['error_msg'] : ''),
  799. 'res' => $member->result,
  800. ];
  801. } else {
  802. //成功处理
  803. if(!empty($member->result['settle_accounts'])){
  804. foreach ($member->result['settle_accounts'] as $item){
  805. if(self::sameData('card_id', $item['account_info']['card_id'], $account_params['account_info']['card_id'])){
  806. return [
  807. 'code' => 0,
  808. 'msg' => 'success1',
  809. 'data' => $item,
  810. ];
  811. }
  812. }
  813. }
  814. }
  815. # 创建结算账户
  816. $account->create($account_params);
  817. # 对创建结算账户结果进行处理
  818. if ($account->isError()){
  819. //失败处理
  820. debug_log([__METHOD__, __LINE__, $account->result, $account_params], __CLASS__ . '.log');
  821. return [
  822. 'code' => 1,
  823. 'msg' => 'adapay创建结算账户失败1,' . (isset($account->result['error_msg']) ? $account->result['error_msg'] : ''),
  824. 'res' => $account->result,
  825. ];
  826. } else {
  827. //成功处理
  828. self::setBankInfo($user_id, $m_store_id, $is_saas, $saas_user_id, $account->result['id']);
  829. return [
  830. 'code' => 0,
  831. 'msg' => 'success',
  832. 'data' => $account->result,
  833. ];
  834. }
  835. }
  836. public static function sameData($type, $data1, $data2) {
  837. if($type == 'card_id'){
  838. $fd = substr($data1, 0, 8) == substr($data2, 0, 8);
  839. $ed = substr($data1, -1) == substr($data2, -1);
  840. return $fd && $ed;
  841. }
  842. return false;
  843. }
  844. public static function getOrderPaymentId($order) {
  845. $payment_id = $order->adapay_payment_id;
  846. if(empty($payment_id)){
  847. $payment_id = self::orderNo2Id($order->store_id, $order->order_no);
  848. if($payment_id['code'] == 0){
  849. $payment_id = $payment_id['data'];
  850. }else{
  851. return $payment_id;
  852. }
  853. }
  854. return [
  855. 'code' => 0,
  856. 'data' => $payment_id,
  857. ];
  858. }
  859. }