123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405 |
- <?php
- namespace huo\controller\pay;
- use huo\controller\common\Base;
- use huo\controller\queue\ApplePayQueue;
- use huo\controller\request\Request;
- use huo\model\order\PayAppleErrorModel;
- use huo\model\order\PayAppleModel;
- use huolib\constant\OrderConst;
- use huolib\constant\PaywayConst;
- use huolib\status\OrderStatus;
- use think\Log;
- class ApplePay extends Base {
- const APPLE_STATUS_SUCCESS = 0;
- const APPLE_STATUS_21000 = 21000;
- const APPLE_STATUS_21002 = 21002;
- const APPLE_STATUS_21003 = 21003;
- const APPLE_STATUS_21004 = 21004;
- const APPLE_STATUS_21005 = 21005;
- const APPLE_STATUS_21006 = 21006;
- const APPLE_STATUS_21007 = 21007;
- const APPLE_STATUS_21008 = 21008;
- private $url_buy = '';
- private $sb_url_buy = '';
- protected $is_sandbox = false;
- private $order_id = '';
-
- public function __construct($is_sandbox = false) {
- $this->url_buy = "https://buy.itunes.apple.com/verifyReceipt";
- $this->sb_url_buy = "https://sandbox.itunes.apple.com/verifyReceipt";
- $this->is_sandbox = $is_sandbox;
- }
-
- public function checkAppleOrder($order_id, $trans_id, $receipt_data = null, $is_sandbox = false, $idfv, $apple_id) {
- $_log_message = "func=".__FUNCTION__."&class=".__CLASS__.'&order_id='.$order_id.'&trans_id='.$trans_id
- .'&receipt_data='.$receipt_data.'&idfv='.$idfv.'&apple_id='.$apple_id.'&step';
- if (empty($trans_id) || empty($receipt_data) || empty($apple_id) || empty($idfv)) {
-
- Log::write($_log_message.'1', LOG::LOG);
- return false;
- }
- $_oc_cache = SdkOrderCache::ins();
- $_apple_data = $_oc_cache->getAppleOrderByTransId($trans_id);
- if (!empty($order_id)) {
-
- if (empty($_apple_data)) {
-
-
- $_apple_data = $this->getUpdateDataByOrderId($order_id, $trans_id, $receipt_data);
- if (false == $_apple_data) {
-
- $this->code = OrderStatus::ORDER_ID_ERROR;
-
- Log::write($_log_message.'2', LOG::LOG);
- return false;
- }
- } elseif (!empty($_apple_data)) {
-
- if ($_apple_data['order_id'] != $order_id) {
-
- $this->code = OrderStatus::ORDER_ID_ERROR;
-
- Log::write($_log_message.'3', LOG::LOG);
- return false;
- }
- }
- }
- if (!empty($_apple_data)) {
-
- $_order_id = $_apple_data['order_id'];
- $_order_data = $_oc_cache->getInfoByOrderId($_order_id);
- if (OrderConst::PAY_STATUS_SUC == $_order_data['status']) {
-
- if (OrderConst::CP_STATUS_SUC == $_order_data['cp_status']) {
-
- $this->code = OrderStatus::NO_ERROR;
- } else {
-
- $_rs = (new Notify())->notify($_order_id);
- $this->code = $_rs['code'];
- }
- return true;
- }
- }
-
- $_rs = $this->checkReceiptData($receipt_data, $is_sandbox);
- if (false == $_rs) {
-
- $this->code = OrderStatus::APPLE_CHECK_FAIL;
-
- Log::write($_log_message.'4', LOG::LOG);
- return false;
- }
- if (self::APPLE_STATUS_SUCCESS != $_rs['status']) {
- $this->code = OrderStatus::RECEIPT_DATA_ERROR;
-
- Log::write($_log_message.'5', LOG::LOG);
- return false;
- }
- if (!isset($_rs['receipt'])
- || !isset($_rs['receipt']['in_app'])
- || !isset($_rs['receipt']['in_app'][0])) {
-
- $this->code = OrderStatus::RECEIPT_DATA_ERROR;
-
- Log::write($_log_message.'6', LOG::LOG);
- return false;
- }
-
- $_receipt_data = $_rs['receipt']['in_app'];
- $_iap_data = [];
- if (!empty($_receipt_data)) {
- foreach ($_receipt_data as $_k => $_v) {
- if ($_v['transaction_id'] == $trans_id) {
- $_iap_data = $_v;
- }
- }
- }
- $_iap_product_id = $_iap_data['product_id'];
-
- $_iap_request_time = round($_rs['receipt']['request_date_ms'] / 1000);
- $_iap_purchase_time = round($_iap_data['purchase_date_ms'] / 1000);
- $_iap_transaction_id = $_iap_data['transaction_id'];
- if ($_iap_transaction_id != $trans_id) {
- $this->code = OrderStatus::TRANS_ID_ERROR;
-
- Log::write($_log_message.'8', LOG::LOG);
- return false;
- }
- $_apple_data['payway'] = PaywayConst::PAYWAY_APPLE;
- if (true == $is_sandbox) {
- $_apple_data['payway'] = PaywayConst::PAYWAY_APPLE_TEST;
- }
- if (empty($_apple_data)) {
-
- $_apple_data = (new PayAppleModel())->getLastOrderData(
- $_iap_request_time, $idfv, $apple_id, $_iap_product_id
- );
- if (empty($_apple_data)) {
-
-
-
- Log::write($_log_message.'9', LOG::ERROR);
- $_pae_data['trans_id'] = $_iap_transaction_id;
- $_pae_data['idfv'] = $idfv;
- $_pae_data['idfa'] = '';
- $_pae_data['apple_id'] = $apple_id;
- $_pae_data['product_id'] = $_iap_product_id;
- $_pae_data['status'] = OrderConst::PAY_STATUS_SUC;
- $_pae_data['payway'] = $_apple_data['payway'];
- $_pae_data['pay_time'] = $_iap_purchase_time;
- $_pae_data['check_cnt'] = 1;
- $_pae_data['last_check_time'] = time();
- $_pae_data['receipt_data'] = $receipt_data;
- $_pae_data['receipt_field'] = json_encode($_iap_data);
- (new PayAppleErrorModel())->addData($_pae_data);
- $this->code = OrderStatus::ORDER_NOT_EXISTS;
-
- return true;
- }
- } else {
-
- if ($_iap_product_id != $_apple_data['product_id']) {
- $this->code = OrderStatus::PRODUCT_ID_ERROR;
-
- Log::write($_log_message.'7', LOG::LOG);
- return false;
- }
- }
- $this->order_id = $_apple_data['order_id'];
- $_apple_data['status'] = OrderConst::PAY_STATUS_SUC;
- $_apple_data['check_cnt']++;
- $_apple_data['last_check_time'] = time();
- $_apple_data['pay_time'] = $_iap_purchase_time;
- $_oc_cache->updateAppleOrder($trans_id, $_apple_data);
- $_order_data = $_oc_cache->getInfoByOrderId($this->order_id);
- (new Notify())->payNotify(
- $_iap_product_id, $order_id, $trans_id, $_order_data['real_amount'], $_apple_data['payway']
- );
- $this->code = OrderStatus::NO_ERROR;
- return true;
- }
-
- public function orderQuery(
- $order_id, $trans_id, $receipt_data = null, $is_sandbox = false, $idfv = '', $apple_id = ''
- ) {
- $_rdata = [
- 'order_id' => $order_id,
- 'trans_id' => $trans_id,
- 'status' => OrderConst::PAY_STATUS_NOT,
- 'cp_status' => OrderConst::CP_STATUS_NOT,
- ];
- $this->order_id = $order_id;
- if (empty($trans_id) || empty($receipt_data)) {
- $_code = OrderStatus::INVALID_PARAMS;
- return $this->huoError($_code, OrderStatus::getMsg($_code), $_rdata);
- }
- $this->checkAppleOrder($order_id, $trans_id, $receipt_data, $is_sandbox, $idfv, $apple_id);
- $_code = $this->code;
- if (OrderStatus::APPLE_CHECK_FAIL == $_code) {
-
- (new ApplePayQueue($apple_id))->setApplePayQueue(
- $order_id, $trans_id, $receipt_data, $is_sandbox, $idfv, $apple_id
- );
- return $this->huoError($_code, OrderStatus::getMsg($_code), $_rdata);
- }
- if (OrderStatus::NO_ERROR != $_code) {
- return $this->huoError($_code, OrderStatus::getMsg($_code), $_rdata);
- }
-
- $_statues = (new Sdk())->getStatus($this->order_id);
- if (false == $_statues) {
- $_code = OrderStatus::ORDER_ID_ERROR;
- return $this->huoError($_code, OrderStatus::getMsg($_code), $_rdata);
- }
- $_rdata = [
- 'order_id' => $this->order_id,
- 'trans_id' => $trans_id,
- 'status' => $_statues['status'],
- 'cp_status' => $_statues['cp_status']
- ];
- return $this->huoSuccess($_code, OrderStatus::getMsg($_code), $_rdata);
- }
-
- private function getUpdateDataByOrderId($order_id, $trans_id, $receipt_data) {
- $_pa_model = new PayAppleModel();
- $_apple_data = $_pa_model->getInfoByOrderId($order_id);
- if (!empty($_apple_data['trans_id'])) {
- if ($_apple_data['trans_id'] == $trans_id) {
- return $_apple_data;
- }
-
- return false;
- }
- $_apple_data['trans_id'] = $trans_id;
- $_apple_data['receipt_data'] = $receipt_data;
- $_rs = $_pa_model->updateData($_apple_data, $_apple_data['id']);
- if (false === $_rs) {
- return false;
- }
- SdkOrderCache::ins()->saveAppleOrder($trans_id, $_apple_data);
- return $_apple_data;
- }
-
- protected function checkReceiptData($receipt, &$is_sandbox = false) {
- if ($is_sandbox) {
- $_url_buy = $this->sb_url_buy;
- } else {
- $_url_buy = $this->url_buy;
- }
- $_param = json_encode(['receipt-data' => $receipt]);
- $_rs = Request::httpJsonpost($_url_buy, $_param);
- if (false === $_rs) {
-
- return false;
- }
- $_rs = json_decode($_rs, true);
- if (empty($_rs) || !isset($_rs['status'])) {
- return false;
- }
- switch ($_rs['status']) {
- case self::APPLE_STATUS_21007:
-
- $_rs = Request::httpJsonpost($this->sb_url_buy, $_param);
- $is_sandbox = false;
- break;
- case self::APPLE_STATUS_21008:
-
- $_rs = Request::httpJsonpost($this->url_buy, $_param);
- $is_sandbox = true;
- break;
- default:
- return $_rs;
- }
- if (false === $_rs) {
-
- return false;
- }
- $_rs = json_decode($_rs, true);
- if (empty($_rs) || !isset($_rs['status'])) {
- return false;
- }
- return $_rs;
- }
- }
|