123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038 |
- <?php
- namespace app\api\controller;
- use app\admin\model\PalmpaySplitAccountLog;
- use app\common\controller\Api;
- use app\common\library\Ip;
- use app\common\library\Redis;
- use app\api\library\OrderDeduction;
- use app\common\service\KuaifenService;
- use app\common\service\OrderService;
- use app\common\service\UserVipExtendService;
- use app\main\constants\ApiConstants;
- use app\main\constants\CacheConstants;
- use app\main\constants\KafkaDotConstants;
- use app\main\constants\PayConstants;
- use app\main\model\object\AnalysisObject;
- use app\main\service\ActivityService;
- use app\main\service\AdminService;
- use app\main\service\JoinPayService;
- use app\main\service\KafkaDotService;
- use app\main\service\LogService;
- use app\main\service\OrderCollectService;
- use app\main\service\PalmPayService;
- use app\main\service\UrlService;
- use app\main\service\UserService;
- use app\main\service\MihuaPayService;
- use app\main\service\IpaynowPayService;
- use app\main\service\WeChatAdService;
- use think\Cookie;
- use think\Exception;
- use think\Log;
- use EasyWeChat\Factory;
- use think\Config;
- use Symfony\Component\Cache\Simple\RedisCache;
- use fast\Random;
- use GuzzleHttp\Client as Http;
- use GuzzleHttp\Exception\GuzzleException;
- use app\main\service\UnsPayService;
- class Activity extends Api
- {
- protected $wxNeedLogin = ['pay'];
- private function _initPayInfo()
- {
- Log::info('[ WeChat ] [ PAY ] [ CALLBACK ] GET: ' . json_encode(var_export($this->request->get(), true),
- JSON_UNESCAPED_UNICODE));
- Log::info('[ WeChat ] [ PAY ] [ CALLBACK ] INPUT: ' . json_encode(var_export($this->request->getInput(), true),
- JSON_UNESCAPED_UNICODE));
- $rid = $this->request->request('id'); // 资源id
- $act_id = $this->request->request('aid'); // 活动ID
- $adminId = UserService::instance()->getAdminId()->data; // 渠道商/代理商ID
- /**
- * 获取渠道商/代理商资料
- */
- $adminExtend = model('AdminExtend')->getInfo($adminId);
- if (!$adminExtend) {
- $this->error('管理员信息获取失败');
- }
- // $channelId = UserService::instance()->getRunTimeObject()->channelId; // 渠道商ID
- $channelId = UserService::instance()->getUserChannelId()->data;
- // $adminConfig = model('AdminConfig')->getAdminInfoAll($channelId);
- if ($adminExtend['distribute'] == '1') {
- //代理商配置信息
- $adminConfig = AdminService::instance()->getAdminConfigModel()->getAdminInfoAll($adminId);
- } else {
- //渠道商配置信息
- $adminConfig = AdminService::instance()->getAdminConfigModel()->getAdminInfoAll($channelId);
- }
- if (!$rid || !$adminId) {
- $this->error('缺少参数');
- }
- $goodsCategory = $this->request->request('category'); //商品分类 nickname
- $group = model('AuthGroupAccess')->where('uid', $adminId)->find();
- $groupId = $group->group_id;
- // $resourceModel = model('resource');
- // $goodsInfo = $resourceModel->find($rid);
- $goodsInfo = ActivityService::instance()->getResourceForFront($rid);
- //渠道自定义活动时,resource的活动ID为空,需要替换
- if ($act_id && empty($goodsInfo['activity_id'])) {
- $goodsInfo['activity_id'] = $act_id;
- }
- if (empty($goodsInfo)) {
- $this->error('商品不存在');
- }
- /**
- * 未登录的逻辑处理
- */
- if (!$this->user->isLogin()) {
- $this->error('登录信息获取失败');
- }
- $channelExtend = $adminExtend;
- if ($groupId == 4) {
- //代理 获取渠道信息
- $channelExtend = AdminService::instance()->getAdminExtendModel()->where(['admin_id' => $channelId])->find();
- }
- return [$goodsCategory, $rid, $adminId, $goodsInfo, $adminExtend, $channelId, $adminConfig, $groupId, $channelExtend];
- }
- /**
- * 创建订单
- * @param $payment 支付方式 0 微信;1 四方平台
- * @param $adminId
- * @param $adminExtend
- * @param $row
- * @param $goodsCategory
- * @param $pdOrderId
- * @param $out_trade_no
- * @param $goodsId
- * @param $payInfo
- * @param $channelId
- * @param $prepay_id
- * @param $groupId
- * @param $pay_json
- * @param $kl_admin_info
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\ModelNotFoundException
- * @throws \think\exception\DbException
- */
- private function _createOrderInfo(
- $payment,
- $adminId,
- $adminExtend,
- $row,
- $goodsCategory,
- $pdOrderId,
- $out_trade_no,
- $goodsId,
- $payInfo,
- $channelId,
- $prepay_id,
- $groupId,
- $pay_json,
- $kl_admin_info,
- $channelExtend
- )
- {
- $user_id = UserService::instance()->getUserInfo()->id;
- $insertData = [
- 'user_id' => $user_id,
- 'admin_id' => $adminId,
- 'benefit' => $adminExtend['benefit'],
- 'money' => $row['money'],
- 'money_benefit' => round($row['money'] * $adminExtend['benefit'], 2),
- 'category' => $goodsCategory,
- 'payid' => $prepay_id,
- 'out_trade_no' => $out_trade_no,
- 'ip' => Ip::ip(),
- 'referral_id' => UrlService::instance()->getUserReferralId()->data,
- 'referral_id_permanent' => UserService::instance()->getUserInfo()->referral_id_permanent,
- 'book_id' => $this->request->request('book_id'),
- 'chapter_id' => $this->request->request('chapter_id'),
- 'goods_id' => $goodsId,
- 'kandian' => $row['kandian'],
- 'free_kandian' => $row['free_kandian'],
- 'day' => $row['day'],
- 'type' => $row['type'],
- 'state' => 0,
- 'pay_json' => $pay_json,
- 'activity_id' => $row['activity_id'],
- 'payment_method' => $payment,
- 'wxpay_id' => $payInfo['id'],
- 'ext' => UserService::instance()->getUserInfo()->ext && json_decode(UserService::instance()->getUserInfo()->ext) ? UserService::instance()->getUserInfo()->ext : json_encode(new \stdClass()),
- 'createtime' => time(),
- 'updatetime' => time(),
- 'channel_id' => $channelId,
- 'channel_benefit' => $channelExtend['benefit'],
- 'group' => $groupId,
- ];
- if ($payment == ApiConstants::PAYMENT_METHOD_PALM) {
- $insertData['pdorderid'] = $pdOrderId; //四方平台订单号
- }
- try {
- if ($kl_admin_info) {
- if ($kl_admin_info['admin_id'] != $channelId) {
- $insertData['deduct'] = 1;
- }
- $insertData['benefit'] = $kl_admin_info['benefit'];
- $insertData['money_benefit'] = round($row['money'] * $kl_admin_info['benefit'], 2);
- $insertData['admin_id'] = $kl_admin_info['admin_id'];
- $insertData['resource_id'] = $adminId;
- $adminId = $kl_admin_info->admin_id;
- $groupId = 3;
- $insertData['group'] = $groupId;
- }
- } catch (\Exception $e) {
- Log::error('订单扣量失败, Error:' . $e->getMessage());
- }
- //转移订单结束
- $ordersId = model('Orders')->insertGetId($insertData);
- if (empty($insertData['deduct']) && $this->request->request('float_id')) {
- Redis::instance()->set(CacheConstants::getFloatTipsOrderId($ordersId), $this->request->request('float_id'));
- }
- if (!$ordersId) {
- $this->error('订单创建失败');
- }
- #region 快分app订单
- KuaifenService::instance()->createKuaifenOrders($ordersId, $insertData['admin_id'], $user_id, 0,
- $insertData['money'], $insertData['out_trade_no']);
- #endregion
- //判断是充值vip还是充值看点
- $isVip = false;
- if (!empty($row['day'])) {
- $isVip = true;
- }
- $isActivity = !empty($row['activity_id']);
- if (empty($insertData['deduct'])) { //如果不是KL
- $channel_id = UserService::instance()->getUserChannelId()->data;
- OrderCollectService::instance()->addCreateOrderCollect($user_id, $adminId, $isVip, $channel_id, $groupId, PayConstants::BUSINESS_WECHAT, $isActivity);
- $oAna = new AnalysisObject();
- $oAna->type = KafkaDotConstants::TYPE_ACTIVITY;
- $oAna->user_from = [
- 'activity_id' => $row['activity_id']
- ];
- $oAna->data = [
- 'stage' => 'start'
- ];
- KafkaDotService::instance()->sendMsg($user_id, $oAna);
- } else {
- OrderCollectService::instance()->addCreateOrderCollect($user_id, $kl_admin_info['admin_id'], $isVip, $kl_admin_info['admin_id'], $groupId, PayConstants::BUSINESS_WECHAT, $isActivity);
- }
- }
- /**
- * 支付下单总入口
- */
- public function pay()
- {
- //默认官方支付
- $payment_method = 0;
- //根据域名进行匹配
- $host = get_host_no_port();
- $payHosts = model('Wxpay')->getHosts();
- if (in_array($host, $payHosts)) {
- //支付域名匹配成功
- $pay_hosts = model('Wxpay')->getInfoByHost($host);
- $payInfo = model('Wxpay')->getInfo($pay_hosts['platform_id'], $pay_hosts['id']);
- if (isset($payInfo['payment_method']) && $payInfo['payment_method'] > 0) {
- $payment_method = $payInfo['payment_method'];
- }
- } else {
- //支付域名匹配失败,从Cookie获取渠道默认支付方式
- $adminId = UserService::instance()->getAdminId()->data; // 渠道商/代理商ID
- $adminConfig = model('AdminConfig')->getAdminInfoAll($adminId);
- if (isset($adminConfig['payment_method']) && $adminConfig['payment_method'] > 0) {
- $payment_method = $adminConfig['payment_method'];
- }
- }
- switch ($payment_method) {
- case ApiConstants::PAYMENT_METHOD_PALM://四方支付
- return $this->payPalm();
- case ApiConstants::PAYMENT_METHOD_JOIN://汇聚支付
- return $this->payJoin();
- case ApiConstants::PAYMENT_METHOD_MIHUA://米花支付
- return $this->payMihua();
- case ApiConstants::PAYMENT_METHOD_UNS://银生宝支付
- return $this->payUns();
- case ApiConstants::PAYMENT_METHOD_IPAYNOW://现在支付
- return $this->payIpaynow();
- default://微信官方支付
- return $this->payWechat();
- }
- }
- /**
- * 微信官方下单
- */
- public function payWechat()
- {
- list($goodsCategory, $goodsId, $adminId, $row, $adminExtend, $channelId, $adminConfig, $groupId, $channelExtend)
- = $this->_initPayInfo();
- switch ($goodsCategory) {
- case 'wechat': //微信公众号支付
- $paymentApplication = Factory::payment(Config::get('wechat'));
- $paymentApplication['cache'] = new RedisCache(Redis::instanceCache());
- $pay_timeout = Config::has('site.pay_timeout') ? Config::get('site.pay_timeout') : 15;
- $payInfo = model('Wxpay')->getInfoByHost(get_host_no_port());
- $userId = UserService::instance()->getUserInfo()->id;
- if ($pay_timeout) {
- $endTime = time() - intval($pay_timeout) * 60;
- $has_orders = model('orders')
- ->where([
- 'goods_id' => $goodsId,
- 'user_id' => $userId,
- 'admin_id' => $adminId,
- 'state' => 0,
- 'payment_method' => ApiConstants::PAYMENT_METHOD_WECHAT
- ])
- ->where('createtime', '>', $endTime)->where('wxpay_id', $payInfo['id'])
- ->find();
- } else {
- $has_orders = null;
- }
- if (!empty($has_orders)) { //如果用户已经在该代理商/渠道商下过该单
- $jssdk = $paymentApplication->jssdk;
- $json = $jssdk->bridgeConfig($has_orders['payid']);
- } else {
- $kl_admin_info = OrderService::instance()->getKlAdminInfo($groupId, $adminId, $channelId, [
- 'day' => $row['day'],
- 'activity_id' => $row['activity_id'],
- 'user_id' => Cookie::get('user_id'),
- 'book_id' => $this->request->request('book_id'),
- ], true)->data;
- $out_trade_no = date('YmdHis') . '_' . $userId . '_' . Random::build('alnum', 4);
- $data = [
- 'body' => $row['type'] == 2 ? '充值VIP' : '充值书币',
- 'out_trade_no' => $out_trade_no,
- 'total_fee' => $row['money'] * 100,
- 'spbill_create_ip' => Ip::ip(),
- 'notify_url' => Config::get('site.scheme') . '://' . Api::PAY_CALLBACK_PREFIX . $payInfo['pay_host'] . '/api/wechat/pay',
- // 支付结果通知网址,如果不设置则会使用配置里的默认地址
- 'trade_type' => 'JSAPI',
- 'openid' => Cookie::get('openid'),
- ];
- $goods_des = Config::get('site.goodsdes');
- if ($goods_des) {
- $data['body'] = $data['body'] . ' ' . $goods_des;
- }
- //添加公众号昵称
- if (!empty($adminConfig['json']['authorizer_info']['nick_name'])) {
- $zfxx = $adminConfig['json']['authorizer_info']['nick_name'] . '_' . $data['body'];
- $data['body'] = mb_substr($zfxx, 0, 120, 'utf-8');
- }
- $palmApiStartTime = microtime(true);
- $result = $paymentApplication->order->unify($data);
- $palmApiEndTime = microtime(true);
- $apiRunTime = round($palmApiEndTime - $palmApiStartTime, 3);
- if ($result['return_code'] == 'FAIL') {
- Log::error(sprintf('wechatpay_create_order_fail!wxpay_id:%s,wxpay_name:%s,mch_id:%s,admin_id:%s,channel_id:%s,user_id:%s,money:%s,good_id:%s,out_trade_no:%s,api_run_time:%s s,errmessage:%s'
- , $payInfo['id'], $payInfo['name'], $payInfo['mcid'], $adminId, $channelId, $userId, $row['money'],
- $goodsId, $out_trade_no, $apiRunTime, json_encode(var_export($result, true), JSON_UNESCAPED_UNICODE)));
- Log::error('微信订单创建失败!订单内容: ' . json_encode(var_export($data, true),
- JSON_UNESCAPED_UNICODE) . " 微信返回内容: " . json_encode(var_export($result, true),
- JSON_UNESCAPED_UNICODE));
- $this->error('微信订单创建失败');
- }
- $this->_createOrderInfo(0, $adminId,
- $adminExtend,
- $row,
- $goodsCategory,
- 0,
- $out_trade_no,
- $goodsId,
- $payInfo,
- $channelId,
- $result['prepay_id'],
- $groupId,
- '',
- $kl_admin_info,
- $channelExtend
- );
- $jssdk = $paymentApplication->jssdk;
- $json = $jssdk->bridgeConfig($result['prepay_id']);
- Log::info(sprintf('wechatpay_create_order_success!wxpay_id:%s,wxpay_name:%s,mch_id:%s,channel_id:%s,user_id:%s,money:%s,good_id:%s,out_trade_no:%s,api_run_time:%s s'
- , $payInfo['id'], $payInfo['name'], $payInfo['mcid'], $adminId, $userId,
- $row['money'], $goodsId, $out_trade_no, $apiRunTime));
- }
- //下单订单数据统计
- $this->success('订单创建成功', ['json' => $json]);
- break;
- case 'wechath5': //微信H5支付
- break;
- case 'alipay': //支付宝支付
- break;
- }
- $this->error('未知充值方式');
- }
- /**
- * 四方支付下单
- */
- public function payPalm()
- {
- list($goodsCategory, $goodsId, $adminId, $goodsInfo, $adminExtend, $channelId, $adminConfig, $groupId, $channelExtend)
- = $this->_initPayInfo();
- $pay_timeout = Config::has('site.pay_timeout') ? Config::get('site.pay_timeout') : 15;
- $payInfo = model('Wxpay')->getInfoByHost(get_host_no_port());
- $userId = UserService::instance()->getUserInfo()->id;
- if ($pay_timeout) {
- $endTime = time() - intval($pay_timeout) * 60;
- $has_orders = model('orders')
- ->where([
- 'goods_id' => $goodsId,
- 'user_id' => $userId,
- 'admin_id' => $adminId,
- 'state' => 0,
- 'payment_method' => ApiConstants::PAYMENT_METHOD_PALM
- ])
- ->where('createtime', '>', $endTime)->where('wxpay_id', $payInfo['id'])
- ->find();
- } else {
- $has_orders = null;
- }
- if (!empty($has_orders)) { //如果用户已经在该代理商/渠道商下过该单
- $json = $has_orders['pay_json'];
- } else {
- $kl_admin_info = OrderService::instance()->getKlAdminInfo($groupId, $adminId, $channelId, [
- 'day' => $goodsInfo['day'],
- 'activity_id' => $goodsInfo['activity_id'],
- 'user_id' => Cookie::get('user_id'),
- 'book_id' => $this->request->request('book_id'),
- ], true)->data;
- $paymentApplication = Factory::payment(Config::get('wechat'));
- $paymentApplication['cache'] = new RedisCache(Redis::instanceCache());
- $out_trade_no = date('YmdHis') . '_' . $userId . '_' . Random::build('alnum', 4);
- $productName = $goodsInfo['type'] == 2 ? '充值VIP' : '充值书币';
- $data = [
- 'mchId' => $payInfo['quartet_merchant_id'],
- 'outTradeNo' => $out_trade_no,
- 'appid' => $payInfo['quartet_app_id'],
- 'version' => ApiConstants::PALM_PAY_VERSION,
- 'money' => $goodsInfo['money'] * 100,
- 'ip' => Ip::ip(),
- 'notifyUrl' => Config::get('site.scheme') . '://' . Api::PAY_CALLBACK_PREFIX . $payInfo['pay_host'] . '/api/wechat/palmpay',
- // 支付结果通知网址,如果不设置则会使用配置里的默认地址
- 'subAppid' => $payInfo['appid'],
- 'openid' => Cookie::get('openid'),
- ];
- if ($payInfo['quartet_is_split'] == ApiConstants::QUARTET_IS_SPLIT) {
- if ($kl_admin_info && $kl_admin_info['admin_id'] != $channelId) {
- $palmPayCmd = OrderService::instance()->getPalmPayCmd($goodsInfo['money'], 0)->data;
- $cmd = $palmPayCmd['cmd'];
- $palmPayCmdDefault = $palmPayCmd['default'];
- } else {
- $palmPayCmd = OrderService::instance()->getPalmPayCmd($goodsInfo['money'], $channelId)->data;
- $cmd = $palmPayCmd['cmd'];
- $palmPayCmdDefault = $palmPayCmd['default'];
- }
- if (!$cmd) {
- LogService::debug("微信分账设置错误");
- $this->success('订单创建失败,请重新下单!');
- }
- $data['cmd'] = $cmd;
- }
- $goods_des = Config::get('site.goodsdes');
- if ($goods_des) {
- $data['productName'] = urlencode($productName . ' ' . $goods_des);
- } else {
- $data['productName'] = urlencode($productName);
- }
- if (!empty($adminConfig['json']['authorizer_info']['nick_name'])) {
- if (empty($goods_des)) {
- $zfxx = $userId . '_' . $adminConfig['json']['authorizer_info']['nick_name'] . '_' . $productName;
- } else {
- $zfxx = $userId . '_' . $adminConfig['json']['authorizer_info']['nick_name'] . '_' . $productName . '_' . $goods_des;
- }
- $data['productDesc'] = mb_substr($zfxx, 0, 120, 'utf-8');
- $data['productDesc'] = urlencode($data['productDesc']);
- }
- $signStr = $payInfo['quartet_app_id'] . 'WECHAT_SUB' . $data['money'] . $data['outTradeNo'] . $payInfo['quartet_app_key'];
- $data['sign'] = md5($signStr);
- $orderInfo = [
- 'goods_id' => $goodsId,
- 'out_trade_no' => $out_trade_no,
- 'admin_id' => $adminId,
- 'user_id' => $userId,
- ];
- try {
- $result = PalmPayService::instance()->payPalmApi($data, $payInfo, $goodsInfo, $orderInfo);
- } catch (Exception $e) {
- $this->success($e->getMessage());
- }
- //分账记录日志
- if (!empty($palmPayCmdDefault)) {
- $channel_palmpay_sub_account_id = $palmPayCmdDefault['channel_palmpay_sub_account_id'];
- $channel_amount = $palmPayCmdDefault['channel_amount'];
- $dz_palmpay_sub_account_id = $palmPayCmdDefault['dz_palmpay_sub_account_id'];
- $dz_amount = $palmPayCmdDefault['dz_amount'];
- PalmpaySplitAccountLog::create([
- 'order_id' => $out_trade_no,
- 'dz_palmpay_sub_account_id' => $dz_palmpay_sub_account_id,
- 'dz_amount' => $dz_amount,
- 'channel_palmpay_sub_account_id' => $channel_palmpay_sub_account_id,
- 'channel_amount' => $channel_amount
- ])->insert();
- }
- $result = $result['result'];
- $payInfoArr = json_decode($result['pay_info'], true);
- $prepay_id = explode('=', $payInfoArr['package'])[1];
- $this->_createOrderInfo(1, $adminId,
- $adminExtend,
- $goodsInfo,
- $goodsCategory,
- $result['pdorderid'],
- $out_trade_no,
- $goodsId,
- $payInfo,
- $channelId,
- $prepay_id,
- $groupId,
- $result['pay_info'],
- $kl_admin_info,
- $channelExtend
- );
- $json = $result['pay_info'];
- }
- //下单订单数据统计
- $this->success('订单创建成功', ['json' => $json]);
- }
- /**
- * 汇聚支付下单
- */
- public function payJoin()
- {
- list($goodsCategory, $goodsId, $adminId, $goodsInfo, $adminExtend, $channelId, $adminConfig, $groupId, $channelExtend)
- = $this->_initPayInfo();
- $pay_timeout = Config::has('site.pay_timeout') ? Config::get('site.pay_timeout') : 15;
- $payInfo = model('Wxpay')->getInfoByHost(get_host_no_port());
- $userId = Cookie::get('user_id');
- if ($pay_timeout) {
- $endTime = time() - intval($pay_timeout) * 60;
- $has_orders = model('orders')
- ->where([
- 'goods_id' => $goodsId,
- 'user_id' => $userId,
- 'admin_id' => $adminId,
- 'state' => 0,
- 'wxpay_id' => $payInfo['id'],
- 'payment_method' => ApiConstants::PAYMENT_METHOD_JOIN
- ])
- ->where('createtime', '>', $endTime)
- ->find();
- } else {
- $has_orders = null;
- }
- if (!empty($has_orders)) { //如果用户已经在该代理商/渠道商下过该单
- $json = $has_orders['pay_json'];
- } else {
- $kl_admin_info = OrderService::instance()->getKlAdminInfo($groupId, $adminId, $channelId, [
- 'day' => $goodsInfo['day'],
- 'activity_id' => $goodsInfo['activity_id'],
- 'user_id' => Cookie::get('user_id'),
- 'book_id' => $this->request->request('book_id'),
- ], true)->data;
- $paymentApplication = Factory::payment(Config::get('wechat'));
- $paymentApplication['cache'] = new RedisCache(Redis::instanceCache());
- $out_trade_no = date('YmdHis') . '_' . $userId . '_' . Random::build('alnum', 4);
- $productName = $goodsInfo['type'] == 2 ? '充值VIP' : '充值书币';
- $data = [
- 'p0_Version' => ApiConstants::JOIN_PAY_VERSION,
- 'p1_MerchantNo' => $payInfo['quartet_merchant_id'],
- 'p2_OrderNo' => $out_trade_no,
- 'p3_Amount' => $goodsInfo['money'],
- 'p4_Cur' => '1',
- 'p9_NotifyUrl' => Config::get('site.scheme') . '://' . Api::PAY_CALLBACK_PREFIX . $payInfo['pay_host'] . '/api/wechat/joinpay',
- 'q1_FrpCode' => ApiConstants::JOIN_PAY_TYPE,
- 'q5_OpenId' => Cookie::get('openid'),
- 'q7_AppId' => $payInfo['appid'],
- ];
- $goods_des = Config::get('site.goodsdes');
- if ($goods_des) {
- $data['p6_ProductDesc'] = $productName . ' ' . $goods_des;
- } else {
- $data['p6_ProductDesc'] = $productName;
- }
- if (!empty($adminConfig['json']['authorizer_info']['nick_name'])) {
- if (empty($goods_des)) {
- $zfxx = $userId . '_' . $adminConfig['json']['authorizer_info']['nick_name'] . '_' . $productName;
- } else {
- $zfxx = $userId . '_' . $adminConfig['json']['authorizer_info']['nick_name'] . '_' . $productName . '_' . $goods_des;
- }
- } else {
- if (empty($goods_des)) {
- $zfxx = $userId . '_' . $productName;
- } else {
- $zfxx = $userId . '_' . $productName . '_' . $goods_des;
- }
- }
- $data['p5_ProductName'] = mb_substr($zfxx, 0, 120, 'utf-8');
- $secret = $payInfo['quartet_app_key'];
- $signStr = $data['p0_Version'] . $data['p1_MerchantNo'] . $data['p2_OrderNo'] . $data['p3_Amount'] . $data['p4_Cur'] . $data['p5_ProductName'] . $data['p6_ProductDesc'] . $data['p9_NotifyUrl'] . $data['q1_FrpCode'] . $data['q5_OpenId'] . $data['q7_AppId'] . $secret;
- $data['hmac'] = md5($signStr);
- $orderInfo = [
- 'goods_id' => $goodsId,
- 'out_trade_no' => $out_trade_no,
- 'admin_id' => $adminId,
- 'user_id' => $userId,
- ];
- $joinService = JoinPayService::instance();
- try {
- $result = $joinService->payJoinApi($data, $payInfo, $goodsInfo, $orderInfo);
- } catch (Exception $e) {
- $this->success($e->getMessage());
- }
- $payInfoArr = json_decode($result['rc_Result'], true);
- $prepay_id = explode('=', $payInfoArr['package'])[1];
- $this->_createOrderInfo(ApiConstants::PAYMENT_METHOD_JOIN, $adminId,
- $adminExtend,
- $goodsInfo,
- $goodsCategory,
- $result['r7_TrxNo'],
- $out_trade_no,
- $goodsId,
- $payInfo,
- $channelId,
- $prepay_id,
- $groupId,
- $result['rc_Result'],
- $kl_admin_info,
- $channelExtend
- );
- $json = $result['rc_Result'];
- }
- //下单订单数据统计
- $this->success('订单创建成功', ['json' => $json]);
- }
- /**
- * 米花支付下单
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\ModelNotFoundException
- * @throws \think\exception\DbException
- */
- public function payMihua()
- {
- list($goodsCategory, $goodsId, $adminId, $goodsInfo, $adminExtend, $channelId, $adminConfig, $groupId, $channelExtend)
- = $this->_initPayInfo();
- $pay_timeout = Config::has('site.pay_timeout') ? Config::get('site.pay_timeout') : 15;
- $payInfo = model('Wxpay')->getInfoByHost(get_host_no_port());
- $userId = Cookie::get('user_id');
- if ($pay_timeout) {
- $endTime = time() - intval($pay_timeout) * 60;
- $has_orders = model('orders')
- ->where([
- 'goods_id' => $goodsId,
- 'user_id' => $userId,
- 'admin_id' => $adminId,
- 'state' => '0',
- 'wxpay_id' => $payInfo['id'],
- 'payment_method' => ApiConstants::PAYMENT_METHOD_MIHUA
- ])
- ->where('createtime', '>', $endTime)
- ->find();
- } else {
- $has_orders = null;
- }
- if (!empty($has_orders)) { //如果用户已经在该代理商/渠道商下过该单
- $json = $has_orders['pay_json'];
- } else {
- $kl_admin_info = OrderService::instance()->getKlAdminInfo($groupId, $adminId, $channelId, [
- 'day' => $goodsInfo['day'],
- 'activity_id' => $goodsInfo['activity_id'],
- 'user_id' => Cookie::get('user_id'),
- 'book_id' => $this->request->request('book_id'),
- ], true)->data;
- $paymentApplication = Factory::payment(Config::get('wechat'));
- $paymentApplication['cache'] = new RedisCache(Redis::instanceCache());
- $out_trade_no = date('YmdHis') . '_' . $userId . '_' . Random::build('alnum', 4);
- $productName = $goodsInfo['type'] == 2 ? '充值VIP' : '充值书币';
- $userId = Cookie::get('user_id'); // 用户ID
- $user = model('User')->getUserInfo($userId);
- $createtimeTs = empty($user) ? time() : $user['createtime'];
- $createtimeStr = date('YmdHis', $createtimeTs);
- $aRiskItem = [
- 'userInfoMerchantNo' => $userId,
- 'userInfoDtRegister' => $createtimeStr,
- ];
- $data = [
- 'merAccount' => $payInfo['quartet_app_id'],
- 'merNo' => $payInfo['quartet_merchant_id'],
- 'orderId' => $out_trade_no,
- 'time' => time(),
- 'amount' => (int)($goodsInfo['money'] * 100),
- 'payWay' => 'WEIXIN',
- 'payType' => 'JSAPI_WEIXIN',
- 'userIp' => Ip::ip(),
- 'openId' => Cookie::get('openid'),
- 'returnUrl' => 'http://www.baidu.com',//前端页面回调地址
- 'notifyUrl' => Config::get('site.scheme') . '://' . Api::PAY_CALLBACK_PREFIX . $payInfo['pay_host'] . '/api/wechat/mihuapay',
- 'riskItem' => json_encode($aRiskItem),
- ];
- $goods_des = Config::get('site.goodsdes');
- if ($goods_des) {
- $data['productDesc'] = $productName . ' ' . $goods_des;
- } else {
- $data['productDesc'] = $productName;
- }
- if (!empty($adminConfig['json']['authorizer_info']['nick_name'])) {
- if (empty($goods_des)) {
- $zfxx = $userId . '丨' . $adminConfig['json']['authorizer_info']['nick_name'] . '丨' . $productName;
- } else {
- $zfxx = $userId . '丨' . $adminConfig['json']['authorizer_info']['nick_name'] . '丨' . $productName . '丨' . $goods_des;
- }
- } else {
- if (empty($goods_des)) {
- $zfxx = $userId . '丨' . $productName;
- } else {
- $zfxx = $userId . '丨' . $productName . '丨' . $goods_des;
- }
- }
- $data['product'] = mb_substr($zfxx, 0, 120, 'utf-8');
- $mihuaService = MihuaPayService::instance($payInfo['quartet_app_key'],
- $payInfo['quartet_app_public_key']);
- $data['sign'] = $mihuaService->getSign($data);
- Log::info('米花支付请求参数:' . json_encode($data));
- $encode_data = $mihuaService->encrypt($data);
- $postData = array(
- 'merAccount' => $payInfo['quartet_app_id'],//商户标识
- 'data' => $encode_data
- );
- $orderInfo = [
- 'goods_id' => $goodsId,
- 'out_trade_no' => $out_trade_no,
- 'admin_id' => $adminId,
- 'user_id' => $userId,
- ];
- try {
- $result = $mihuaService->payMihuaApi($postData, $data, $payInfo, $goodsInfo, $orderInfo);
- } catch (Exception $e) {
- $this->success($e->getMessage());
- }
- $prepay_id = $result['data']['mbOrderId'];
- $this->_createOrderInfo(ApiConstants::PAYMENT_METHOD_MIHUA, $adminId,
- $adminExtend,
- $goodsInfo,
- $goodsCategory,
- 0,
- $out_trade_no,
- $goodsId,
- $payInfo,
- $channelId,
- $prepay_id,
- $groupId,
- $result['data']['payInfo'],
- $kl_admin_info,
- $channelExtend
- );
- $json = $result['data']['payInfo'];
- }
- $this->success('订单创建成功', ['json' => $json]);
- }
- public function payUns()
- {
- list($goodsCategory, $goodsId, $adminId, $goodsInfo, $adminExtend, $channelId, $adminConfig, $groupId, $channelExtend)
- = $this->_initPayInfo();
- $pay_timeout = Config::has('site.pay_timeout') ? Config::get('site.pay_timeout') : 15;
- $payInfo = model('Wxpay')->getInfoByHost(get_host_no_port());
- $userId = Cookie::get('user_id');
- if ($pay_timeout) {
- $endTime = time() - intval($pay_timeout) * 60;
- $has_orders = model('orders')
- ->where([
- 'goods_id' => $goodsId,
- 'user_id' => $userId,
- 'admin_id' => $adminId,
- 'state' => '0',
- 'wxpay_id' => $payInfo['id'],
- 'payment_method' => ApiConstants::PAYMENT_METHOD_UNS
- ])
- ->where('createtime', '>', $endTime)
- ->find();
- } else {
- $has_orders = null;
- }
- if (!empty($has_orders)) { //如果用户已经在该代理商/渠道商下过该单
- $json = $has_orders['pay_json'];
- } else {
- $kl_admin_info = OrderService::instance()->getKlAdminInfo($groupId, $adminId, $channelId, [
- 'day' => $goodsInfo['day'],
- 'activity_id' => $goodsInfo['activity_id'],
- 'user_id' => Cookie::get('user_id'),
- 'book_id' => $this->request->request('book_id'),
- ], true)->data;
- $paymentApplication = Factory::payment(Config::get('wechat'));
- $paymentApplication['cache'] = new RedisCache(Redis::instanceCache());
- $out_trade_no = date('YmdHis') . $userId . Random::build('alnum', 4);
- $productName = $goodsInfo['type'] == 2 ? '充值VIP' : '充值书币';
- $data = [
- 'accountId' => $payInfo['quartet_app_id'],
- 'orderId' => $out_trade_no,
- 'amount' => $goodsInfo['money'],
- 'responseUrl' => 'http://' . Api::PAY_CALLBACK_PREFIX . $payInfo['pay_host'] . '/api/wechat/unspay',
- 'openId' => Cookie::get('openid'),
- 'version' => '1.0.1',
- ];
- $goodsDes = Config::get('site.goodsdes');
- if ($goodsDes) {
- $data['commodity'] = $productName . ' ' . $goodsDes;
- } else {
- $data['commodity'] = $productName;
- }
- if (!empty($adminConfig['json']['authorizer_info']['nick_name'])) {
- if (empty($goods_des)) {
- $zfxx = $userId . '丨' . $adminConfig['json']['authorizer_info']['nick_name'] . '丨' . $productName;
- } else {
- $zfxx = $userId . '丨' . $adminConfig['json']['authorizer_info']['nick_name'] . '丨' . $productName . '丨' . $goods_des;
- }
- } else {
- if (empty($goods_des)) {
- $zfxx = $userId . '丨' . $productName;
- } else {
- $zfxx = $userId . '丨' . $productName . '丨' . $goods_des;
- }
- }
- $unsPayService = UnsPayService::instance($payInfo['quartet_app_key']);
- $data['subject'] = mb_substr($zfxx, 0, 120, 'utf-8');
- $data['mac'] = $unsPayService->makeMacParams($data);
- $orderInfo = [
- 'goods_id' => $goodsId,
- 'out_trade_no' => $out_trade_no,
- 'admin_id' => $adminId,
- 'user_id' => $userId,
- ];
- try {
- $result = $unsPayService->payUnsApi($data, $payInfo, $goodsInfo, $orderInfo);
- } catch (Exception $e) {
- $this->success($e->getMessage());
- }
- $strmPackage = $result['mPackage'];
- $amPackage = explode('=', $strmPackage);
- $prepayId = $amPackage[1];
- $payJson = UnsPayService::makeJsJsonParam($result);
- $this->_createOrderInfo(ApiConstants::PAYMENT_METHOD_UNS, $adminId,
- $adminExtend,
- $goodsInfo,
- $goodsCategory,
- 0,
- $out_trade_no,
- $goodsId,
- $payInfo,
- $channelId,
- $prepayId,
- $groupId,
- $payJson,
- $kl_admin_info,
- $channelExtend
- );
- $json = $payJson;
- }
- $this->success('订单创建成功', ['json' => $json]);
- }
- public function payIpaynow()
- {
- list($goodsCategory, $goodsId, $adminId, $goodsInfo, $adminExtend, $channelId, $adminConfig, $groupId, $channelExtend)
- = $this->_initPayInfo();
- $pay_timeout = Config::has('site.pay_timeout') ? Config::get('site.pay_timeout') : 15;
- $payInfo = model('Wxpay')->getInfoByHost(get_host_no_port());
- $userId = Cookie::get('user_id');
- if ($pay_timeout) {
- $endTime = time() - intval($pay_timeout) * 60;
- $has_orders = model('orders')
- ->where([
- 'goods_id' => $goodsId,
- 'user_id' => $userId,
- 'admin_id' => $adminId,
- 'state' => '0',
- 'wxpay_id' => $payInfo['id'],
- 'payment_method' => ApiConstants::PAYMENT_METHOD_IPAYNOW
- ])
- ->where('createtime', '>', $endTime)
- ->find();
- } else {
- $has_orders = null;
- }
- if (!empty($has_orders)) {//如果用户已经在该代理商/渠道商下过该单
- $json = $has_orders['pay_json'];
- } else {
- $kl_admin_info = OrderService::instance()->getKlAdminInfo($groupId, $adminId, $channelId, [
- 'day' => $goodsInfo['day'],
- 'activity_id' => $goodsInfo['activity_id'],
- 'user_id' => Cookie::get('user_id'),
- 'book_id' => $this->request->request('book_id'),
- ], true)->data;
- $paymentApplication = Factory::payment(Config::get('wechat'));
- $paymentApplication['cache'] = new RedisCache(Redis::instanceCache());
- $out_trade_no = date('YmdHis') . '_' . $userId . '_' . Random::build('alnum', 4);
- $productName = $goodsInfo['type'] == 2 ? '充值VIP' : '充值书币';
- $data = [
- 'funcode' => 'WP001',
- 'version' => '1.0.0',
- 'appId' => $payInfo['quartet_app_id'],
- 'mhtOrderNo' => $out_trade_no,
- 'mhtOrderType' => '01',
- 'mhtCurrencyType' => '156',
- 'mhtOrderAmt' => $goodsInfo['money'] * 100,
- 'mhtOrderStartTime' => date('YmdHis'),
- 'notifyUrl' => Config::get('site.scheme') . '://' . Api::PAY_CALLBACK_PREFIX . $payInfo['pay_host'] . '/api/wechat/ipaynowpay',
- 'frontNotifyUrl' => Config::get('site.scheme') . '://' . Api::PAY_CALLBACK_PREFIX . $payInfo['pay_host'] . '/api/wechat/ipaynowpay',
- 'mhtCharset' => 'UTF-8',
- 'deviceType' => '0600',
- 'payChannelType' => '13',
- 'outputType' => '1',
- 'mhtSubAppId' => $payInfo['appid'],
- 'consumerId' => Cookie::get('openid'),
- 'mhtLimitPay' => '0',
- 'mhtSignType' => 'MD5',
- ];
- $goodsDes = Config::get('site.goodsdes');
- if ($goodsDes) {
- $data['mhtOrderDetail'] = $productName . ' ' . $goodsDes;
- } else {
- $data['mhtOrderDetail'] = $productName;
- }
- if (!empty($adminConfig['json']['authorizer_info']['nick_name'])) {
- if (empty($goods_des)) {
- $zfxx = $userId . '_' . $adminConfig['json']['authorizer_info']['nick_name'] . '_' . $productName;
- } else {
- $zfxx = $userId . '_' . $adminConfig['json']['authorizer_info']['nick_name'] . '_' . $productName . '_' . $goods_des;
- }
- } else {
- if (empty($goods_des)) {
- $zfxx = $userId . '_' . $productName;
- } else {
- $zfxx = $userId . '_' . $productName . '_' . $goods_des;
- }
- }
- $data['mhtOrderName'] = mb_substr($zfxx, 0, 120, 'utf-8');
- $privateKey = $payInfo['quartet_app_private_no'];
- $data['mhtSignature'] = IpaynowPayService::instance($privateKey)->makeSign($data);
- $orderInfo = [
- 'goods_id' => $goodsId,
- 'out_trade_no' => $out_trade_no,
- 'admin_id' => $adminId,
- 'user_id' => $userId,
- ];
- try {
- $result = IpaynowPayService::instance($payInfo['quartet_app_key'])->payIpaynowApi($data, $payInfo,
- $goodsInfo, $orderInfo);
- } catch (Exception $e) {
- $this->success($e->getMessage());
- }
- $tnStr = urldecode($result['tn']);
- parse_str($tnStr, $aJson);
- $aJson['appId'] = $aJson['wxAppId'];
- $aJson['package'] = 'prepay_id=' . $aJson['prepay_id'];
- unset($aJson['wxAppId']);
- unset($aJson['prepay_id']);
- $json = json_encode($aJson);
- $this->_createOrderInfo(ApiConstants::PAYMENT_METHOD_IPAYNOW, $adminId,
- $adminExtend,
- $goodsInfo,
- $goodsCategory,
- 0,
- $out_trade_no,
- $goodsId,
- $payInfo,
- $channelId,
- '',
- $groupId,
- $json,
- $kl_admin_info,
- $channelExtend
- );
- }
- $this->success('订单创建成功', ['json' => $json]);
- }
- }
|