123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385 |
- <?php
- /**
- * OrderController.php UTF-8
- * 小程序订单接口
- *
- * @date : 2018/8/9 22:38
- *
- * @license 这不是一个自由软件,未经授权不许任何使用和传播。
- * @author : wuyonghong <wyh@huosdk.com>
- * @version : HuoMp 1.0
- */
- namespace mini\sdk\controller;
- use huo\controller\common\HuoSession;
- use huo\controller\game\GameCache;
- use huo\controller\game\GamePaySwitchCache;
- use huo\controller\member\MemCache;
- use huo\controller\pay\GamePay;
- use huo\controller\pay\Notify;
- use huo\controller\pay\PaySwitch;
- use huo\controller\pay\PtbPay;
- use huo\controller\pay\Sdk;
- use huo\controller\pay\SdkOrderCache;
- use huo\model\member\MemGameModel;
- use huo\model\member\MemoauthModel;
- use huo\model\order\OrderModel;
- use huoAgentSwitch\controller\AgentSwitchController;
- use huolib\constant\CacheConst;
- use huolib\constant\CommonConst;
- use huolib\constant\GameConst;
- use huolib\constant\MemConst;
- use huolib\constant\MpConfConst;
- use huolib\constant\OauthConst;
- use huolib\constant\OrderConst;
- use huolib\constant\PaywayConst;
- use huolib\constant\WalletConst;
- use huolib\pay\Pay;
- use huolib\status\CommonStatus;
- use huolib\status\MemberStatus;
- use huolib\status\OrderStatus;
- use huolib\tool\RateLimit;
- use huolib\utils\OrderUtils;
- use huomp\controller\game\GameMini;
- use huomp\controller\order\OrderOut;
- use huomp\controller\share\QrCodeOut;
- use huomp\model\game\GameMiniModel;
- use huomp\model\weixin\MpConfModel;
- use huoMpQr\QrCode;
- use mini\common\controller\V2ApiBaseController;
- use think\Cache;
- use think\Log;
- class OrderController extends V2ApiBaseController {
- public function _initialize() {
- parent::_initialize();
- // Log::write(
- // $this->request->scheme().'://'.$this->request->server('HTTP_HOST').$this->request->server('REQUEST_URI').'?'
- // .$this->request->getContent(),
- // Log::LOG
- // );
- }
- /**
- * 预下单
- * http://doc.1tsdk.com/159?page_id=4381
- * 【域名】/mp/preorder
- */
- public function preorder() {
- $this->checkLogin();
- $_rs = (new RateLimit())->rateLimit($this->mem_id, true, true, 1, 3);
- if (false == $_rs) {
- $_code = CommonStatus::TOO_MANY_REQUESTS;
- $this->error(CommonStatus::getMsg($_code));
- }
- $_game_rq = $this->setGameData();
- $_channel_rq = $this->setChannelData();
- $_device_rq = $this->setDeviceData();
- $_mem_rq = $this->setMemData();
- $_role_rq = $this->setRoleData();
- $_order_rq = $this->setOrderData();
- $_mem_data = MemCache::ins()->getInfoById($this->mem_id);
- if (isset($_mem_data['status']) && $_mem_data['status'] == MemConst::STATUS_FORBID) {
- $_code = MemberStatus::LOGIN_IS_OUT;
- $this->error(lang(MemberStatus::getMsg($_code)), [], $_code);
- }
- $_mem_game_info = (new MemGameModel())->getInfoByAppMemId($_game_rq->getHAppId(), $this->mem_id);
- $_agent_id = $_mem_game_info['guided_agent_id'] ?? 0;
- if (empty($_agent_id)) {
- $_agent_id = $_mem_data['agent_id'] ?? 0;
- }
- $_mem_rq->setAgentId($_agent_id);
- $_channel_rq->setAgentId($_agent_id);
- $_order = new Sdk();
- $_pay_check = OrderConst::PAY_SWITCH_NO;
- /* 判断支付切换 */
- if (GameConst::GAME_MP_GAME == $_game_rq->getPkgName()) {
- $_pay_check = (new PaySwitch())->getPaySwitch(
- $_order_rq, $_role_rq, $_mem_rq, $_game_rq, $_channel_rq, $_device_rq
- );
- }
- $_is_sand = false;
- if (GameConst::GAME_MP_GAME == $_game_rq->getPkgName()) {
- /* 判断是否上线 上线使用正式环境 未上线使用沙盒环境 */
- $_game_data = GameCache::ins()->getInfoByAppId($_game_rq->getHAppId());
- $_pay_way = PaywayConst::PAYWAY_MPAY;
- if (GameConst::GAME_STATUS_ACCESS == $_game_data['status']) {
- $_is_sand = true;
- $_pay_way = PaywayConst::PAYWAY_MPAY_TEST;
- }
- $_order_rq->setPayway($_pay_way);
- }
- $_preorder_rs = $_order->preorder($_order_rq, $_role_rq, $_mem_rq, $_game_rq, $_channel_rq, $_device_rq);
- if (OrderStatus::NO_ERROR != $_preorder_rs['code']) {
- $this->returnData($_preorder_rs);
- }
- $_order_id = $_preorder_rs['data']['order_id'];
- $_pay_token = $_order_rq->genPayToken($_order_id);
- $_rdata['order_id'] = $_order_id;
- $_rdata['pay_token'] = $_pay_token;
- $_rdata['check'] = $_pay_check;
- $_rdata['pay_url'] = '';
- if (GameConst::GAME_MP_GAME == $_game_rq->getPkgName()) {
- $_mp_data = (new OrderOut())->getMpayData($_order_id, $_is_sand);
- $_rdata = array_merge($_rdata, $_mp_data['data']);
- }
- $this->success(lang('SUCCESS'), $_rdata);
- }
- /**
- * 获取订单ID
- *
- * @return mixed|string
- */
- protected function getOrderId() {
- $_order_rq = $this->setOrderData();
- $_order_id = $_order_rq->getOrderId();
- if (empty($_order_id)) {
- $_order_id = get_val($this->rq_data, 'order_id');
- }
- $_order_id = urldecode($_order_id);
- if (strpos($_order_id, '&')) {
- $_mem_app_arr = explode('&', $_order_id);
- $_mem_id = $_mem_app_arr['0'];
- $_app_id = $_mem_app_arr['1'];
- $_order_id = (new OrderModel())->getLastOrderId($_mem_id, $_app_id);
- }
- return $_order_id;
- }
- /**
- * 点击支付
- * http://doc.1tsdk.com/159?page_id=4383
- *【域名】/mp/wx/pay
- */
- public function pay() {
- $this->checkLogin();
- $_rs = (new RateLimit())->rateLimit($this->mem_id, true, true, 1, 3);
- if (false == $_rs) {
- $_code = CommonStatus::TOO_MANY_REQUESTS;
- $this->error(CommonStatus::getMsg($_code));
- }
- $_game_rq = $this->setGameData();
- $_app_id = $_game_rq->getHAppId();
- $_order_rq = $this->setOrderData();
- $_order_id = $this->getOrderId();
- $_payway = get_val($this->rq_data, 'payway', '');
- $_pw_check_rs = OrderUtils::checkPayway($_payway);
- if (OrderStatus::NO_ERROR != $_pw_check_rs) {
- $this->error(OrderStatus::getMsg($_pw_check_rs), [], $_pw_check_rs);
- }
- /* 判断是否使用平台币 */
- $_has_ptb = get_val($this->rq_data, 'has_ptb', 1);
- if (OrderConst::PAY_HAS_PTB == $_has_ptb) {
- /* 使用平台币 先记录入缓存 */
- $_rdata = (new PtbPay())->PtbOrder($_order_id);
- if (OrderStatus::NO_ERROR != $_rdata['code']) {
- $this->returnData($_rdata);
- }
- }
- $_order_data = SdkOrderCache::ins()->getInfoByOrderId($_order_id);
- if (empty($_order_data)) {
- $_code = OrderStatus::ORDER_NOT_EXISTS;
- $this->error(OrderStatus::getMsg($_code), [], $_code);
- }
- if ($_order_data['real_amount'] <= CommonConst::CONST_ZERO_COMPARE) {
- /* 完全使用平台币支付 */
- $_rs = (new PtbPay())->ptbSdkPay($_order_id);
- $this->returnData($_rs);
- }
- /* 游戏币消费 特有流程 */
- if (PaywayConst::PAYWAY_GAMEPAY == strtolower($_payway)) {
- $_rs = (new GamePay())->GameSdkPay($_order_id);
- $this->returnData($_rs);
- }
- $_order_rq->setDataFromOrder($_order_data);
- $_pay_class = Pay::ins()->get($_payway);
- /* 微信支付 小程序支付 */
- $_func = 'mpPay';
- $_config = (new GameMini())->getPayConf($_app_id);
- $_show_url = url(
- 'sdk/'.$_payway.'/showUrl', ['order_id' => $_order_id],
- false, MPSITE
- );
- $_return_url = url(
- 'sdk/'.$_payway.'/returnUrl',
- ['order_id' => $_order_id], false, MPSITE
- );
- $_notify_url = url('sdk/'.$_payway.'/notifyUrl', '', false, MPSITE);
- // Log::write(
- // array($_show_url, $_return_url, $_notify_url),
- // Log::ERROR
- // );
- $_pay_class->setNotifyUrl($_notify_url);
- $_pay_class->setReturnUrl($_return_url);
- $_pay_class->setShowUrl($_show_url);
- $_pay_class->setOrderId($_order_id);
- $_pay_class->setProductName($_order_rq->getProductName());
- $_pay_class->setProductDesc($_order_rq->getProductDesc());
- $_pay_class->setRealAmount($_order_rq->getProductRealPrice());
- $_pay_class->setProductPrice($_order_rq->getProductPrice());
- $_pay_class->setProductId(WalletConst::WALLET_PRODUCT_MP);
- $_pay_class->setIp($this->request->ip());
- $_pay_class->setPayway($_payway);
- //$_pay_class->setOpenId((new HuoSession($this->mem_id, $_app_id))->getOpenId());
- $_conf_id = (new MpConfModel())->getIdByAppId($_app_id, MpConfConst::MP_CONF_TYPE_6);
- $_openid = (new MemoauthModel())->getOpenidByMemId(OauthConst::OAUTH_MP, $this->mem_id, $_conf_id);
- $_pay_class->setOpenId($_openid);
- // Log::write(
- // array($_config, $_pay_class),
- // Log::ERROR
- // );
- $_pay_rs = $_pay_class->$_func($_config);
- if (empty($_pay_rs)) {
- $_code = OrderStatus::PAYWAY_PREORDER_ERROR;
- $this->error(OrderStatus::getMsg($_code), [], $_code);
- }
- /* 更新支付方式 */
- $_pay_alias = $_pay_rs['pay_type'];
- $_order_data['payway'] = $_pay_alias;
- $_order_data = (new AgentSwitchController())->orderSwitch($_order_data);
- SdkOrderCache::ins()->updateOrder($_order_id, $_order_data);
- $_code = OrderStatus::NO_ERROR;
- $this->success(OrderStatus::getMsg($_code), $_pay_rs, $_code);
- }
- /**
- * 查询支付结果
- * http://doc.1tsdk.com/159?page_id=4384
- * 【域名】/mp/order/query
- */
- public function read() {
- $_rs = (new RateLimit())->rateLimit($this->mem_id, true, true, 1, 3);
- if (false == $_rs) {
- $_code = CommonStatus::TOO_MANY_REQUESTS;
- $this->error(CommonStatus::getMsg($_code));
- }
- $_order_rq = $this->setOrderData();
- $_order = new Sdk();
- $_rdata = $_order->getStatus($_order_rq->getOrderId());
- if (false == $_rdata) {
- $this->error('ERROR');
- }
- if (OrderConst::CP_STATUS_SUC != $_rdata['cp_status'] && OrderConst::PAY_STATUS_SUC == $_rdata['status']) {
- $_rs = (new Notify())->notify($_order_rq->getOrderId());
- if (OrderStatus::NO_ERROR == $_rs['code']) {
- $_rdata['status'] = OrderConst::PAY_STATUS_SUC;
- $_rdata['cp_status'] = OrderConst::CP_STATUS_SUC;
- }
- }
- $_rdata['order_id'] = $_order_rq->getOrderId();
- $this->success(lang('SUCCESS'), $_rdata);
- }
- /**
- * 获取订单信息
- * http://doc.1tsdk.com/159?page_id=4465
- * 【域名】/mp/pay/info
- */
- public function getInfo() {
- $this->checkLogin();
- $_order_id = $this->getOrderId();
- $_rdata = (new Sdk())->getPayInfo($_order_id);
- $this->returnData($_rdata);
- }
- /**
- * 获取跳转支付信息
- * http://doc.1tsdk.com/159?page_id=4805
- * 【域名】/mp/order/checkinfo
- */
- public function getSwitchInfo() {
- $_game_rq = $this->setGameData();
- $_path = 'pages/pay/index';
- $_order_rq = $this->setOrderData();
- $_order_id = $_order_rq->getOrderId();
- if (empty($_order_id)) {
- $_order_id = get_val($this->rq_data, 'order_id');
- }
- $_switch_rule = GamePaySwitchCache::ins()->getInfoByAppId($_game_rq->getHAppId());
- $_rdata['mp_id'] = '';
- $_rdata['pay_type'] = 0;
- if (!empty($_switch_rule)) {
- $_rdata['pay_type'] = $_switch_rule['pay_type'];
- if (OrderConst::PAY_SWITCH_PAY_TYPE_2 != $_switch_rule['pay_type']) {
- $_path = $_switch_rule['pages'];
- $_switch_app_id = $_switch_rule['switch_app_id'];
- $_rdata['mp_id'] = (new GameMiniModel())->getMpIdByAppId($_switch_app_id);
- }
- if (OrderConst::PAY_SWITCH_PAY_TYPE_4 == $_switch_rule['pay_type']) {
- /* 客服跳转充值 需将当前单号写入缓存,缓存时间为5分钟,缓存失效前每次进入客服都将弹出该未支付订单 */
- $_key = CacheConst::CACHE_CUSTOMER_ORDER_PAY_PREFIX.$this->mem_id;
- Cache::set($_key, $_order_id, CommonConst::CONST_5_MINUTE_SECONDS);
- }
- }
- $_rdata['path'] = $_path.'?orderId='.$_order_id.'&from=2';
- $_rdata['intro'] = '点击二维码,长按识别支付';
- $_order_data = SdkOrderCache::ins()->getInfoByOrderId($_order_id);
- if (!empty($_order_data)) {
- $_order_out = new OrderOut();
- $_image = $_order_out->getMemAppQrCode($_order_data['mem_id'], $_order_data['app_id']);
- if (!empty($_image)) {
- $_rdata['image'] = $_image;
- #$_rdata['poster_img'] = (new QrCode())->getPosterImg($_image);
- $_rdata['poster_img'] = $_rdata['image'];
- }
- }
- $this->success(lang('SUCCESS'), $_rdata);
- }
- /**
- * 获取切换二维码
- * http://doc.1tsdk.com/159?page_id=4491
- * 【域名】/mp/order/qrcode
- */
- public function getQrCode() {
- $_game_rq = $this->setGameData();
- $_order_rq = $this->setOrderData();
- $_order_id = $_order_rq->getOrderId();
- if (empty($_order_id)) {
- $_order_id = get_val($this->rq_data, 'order_id');
- }
- $_is_last = $this->request->param('is_last/d', 0);
- if (OrderConst::ORDER_SWITCH_LAST == $_is_last) {
- $_rdata['code'] = CommonStatus::INVALID_PARAMS;
- $_rdata['msg'] = CommonStatus::getMsg($_rdata['code']);
- $_rdata['data'] = [];
- $_order_data = SdkOrderCache::ins()->getInfoByOrderId($_order_id);
- if (!empty($_order_data)) {
- $_image = (new OrderOut())->getMemAppQrCode($_order_data['mem_id'], $_order_data['app_id'], true);
- if (!empty($_image)) {
- $_rdata['code'] = CommonStatus::NO_ERROR;
- $_rdata['msg'] = CommonStatus::getMsg($_rdata['code']);
- $_rdata['data']['image'] = $_image;
- }
- }
- } else {
- $_path = 'pages/pay/index';
- $_switch_rule = GamePaySwitchCache::ins()->getInfoByAppId($_game_rq->getHAppId());
- $_rdata['mp_id'] = '';
- $_switch_app_id = 0;
- if (!empty($_switch_rule)) {
- $_path = $_switch_rule['pages'];
- $_switch_app_id = $_switch_rule['switch_app_id'];
- }
- $_width = get_val($this->rq_data, 'width', 430);
- $_a_color = get_val($this->rq_data, 'auto_color', 1);
- $_line_color = get_val($this->rq_data, 'line_color', '{"r":"0","g":"0","b":"0"}');
- $_hyaline = get_val($this->rq_data, 'is_hyaline', 1);
- $_auto_color = false;
- $_is_hyaline = false;
- if (2 == $_a_color) {
- $_auto_color = true;
- }
- if (2 == $_hyaline) {
- $_is_hyaline = true;
- }
- $_rdata = (new QrCodeOut())->getOrderQrCode(
- $_order_id, $_switch_app_id, $_path, $_width, $_auto_color, $_line_color, $_is_hyaline
- );
- }
- $this->returnData($_rdata);
- }
- }
|