site_id = $site_id; $this->platform = config('alipay.platform'); if ($site_id) { $config_info = $config_model->getAppConfig($site_id)['data']['value']; $this->uconfig = $config_info; if (isset($config_info['line_type']) && $config_info['line_type'] == 'auth') { $this->appAuthToken = $this->uconfig['app_auth_token']; $config_info = $this->platform; } } else { $config_info = config('alipay.platform'); } $this->config = $config_info; $options = new AliSdkCon(); $options->protocol = 'https'; $options->gatewayHost = 'openapi.alipay.com'; $options->signType = 'RSA2'; $options->appId = $config_info['appid'] ?? ''; // 为避免私钥随源码泄露,推荐从文件中读取私钥字符串而不是写入源码中 $options->merchantPrivateKey = $config_info['private_key'] ?? ""; //'<-- 请填写您的应用私钥,例如:MIIEvQIBADANB ... ... -->'; $options->alipayCertPath = ''; //'<-- 请填写您的支付宝公钥证书文件路径,例如:/foo/alipayCertPublicKey_RSA2.crt -->'; $options->alipayRootCertPath = ''; //'<-- 请填写您的支付宝根证书文件路径,例如:/foo/alipayRootCert.crt" -->'; $options->merchantCertPath = ''; //'<-- 请填写您的应用公钥证书文件路径,例如:/foo/appCertPublicKey_2019051064521003.crt -->'; //注:如果采用非证书模式,则无需赋值上面的三个证书路径,改为赋值如下的支付宝公钥字符串即可 $options->alipayPublicKey = $config_info['alipay_public_key'] ?? ""; // '<-- 请填写您的支付宝公钥,例如:MIIBIjANBg... -->'; //可设置异步通知接收服务地址(可选) $options->notifyUrl = ''; //"<-- 请填写您的支付类接口异步通知接收服务地址,例如:https://www.test.com/callback -->"; //可设置AES密钥,调用AES加解密相关接口时需要(可选) $options->encryptKey = $config_info['encryptKey'] ?? ''; // 'du/cSQ7P4YPw4d8+3jUc3w=='; //"<-- 请填写您的AES密钥,例如:aa4BtZ4tspm2wnXLb1ThQA== -->"; Factory::setOptions($options); } /*** * 获取系统配置 * @return mixed */ public function getConfig() { $config = $this->uconfig; $config['platform'] = $this->platform; return $config; } /** * 消息解密 * @param array $param */ public function decryptData($encryptedData) { try { //2. 发起API调用(以支付能力下的统一收单交易创建接口为例) $result = Factory::util() ->AES() ->agent($this->appAuthToken) ->decrypt($encryptedData); return json_decode($result, true); } catch (\Exception $e) { return $this->error([], $e->getMessage()); } } /*** * @param $authCode * @return array|object|\Psr\Http\Message\ResponseInterface|\WannanBigPig\Supports\Collection|\WannanBigPig\Supports\Http\Response * @throws \EasyAlipay\Kernel\Exceptions\InvalidSignException * @throws \GuzzleHttp\Exception\GuzzleException * @throws \WannanBigPig\Supports\Exceptions\InvalidArgumentException */ public function handleAuthorize($authCode, $grant_type = 'authorization_code') { try { $textParams = []; $bizParams = [ 'grant_type' => $grant_type, 'code' => $authCode, ]; //2. 发起API调用(以支付能力下的统一收单交易创建接口为例) $result = Factory::util() ->generic()->execute("alipay.open.auth.token.app", $textParams, $bizParams); return json_decode($result->httpBody, true)['alipay_open_auth_token_app_response']; } catch (\Exception $e) { return $e->getMessage(); } } /** * 获取授权地址 * @param $urls //回调地址 * @param string $type * @return string */ public function getPreAuthorizationUrl($urls, $type = 'WEBAPP,MOBILEAPP,PUBLICAPP,TINYAPP') { $urls = urlencode($urls); $appid = $this->config['appid'] ?? ''; $auth_url = "https://openauth.alipay.com/oauth2/appToAppAuth.htm?app_id={$appid}&redirect_uri={$urls}"; return $auth_url; } public function getminiAuthorizationUrl($urls, $state) { $bizDataObj = [ 'platformCode' => 'O', 'taskType' => 'INTERFACE_AUTH', 'agentOpParam' => [ 'redirectUri' => $urls, 'appTypes' => ["TINYAPP", "BASEAPP"], 'isvAppId' => $this->config['appid'], 'state' => $state, ], ]; $bizData = json_encode($bizDataObj); $url = urlencode('pages/authorize/index?bizData=' . $bizData); $auth_url = "alipays://platformapi/startapp?appId=2021003130652097&page={$url}"; return $auth_url; } /** * Common: 支付宝用户相关请求 * Author: wu-hui * Time: 2023/01/05 13:44 * @param $authToken * @param $api * @param array $params * @param array $textParams * @return mixed|string */ public function requestMemberApi($authToken, $api, $params = [], $textParams = []) { try { $result = Factory::util() ->generic() ->agent($this->appAuthToken) ->auth($authToken) ->execute($api, $textParams, $params); return json_decode($result->httpBody, true); } catch (\Exception $e) { return $e->getMessage(); } } /** * Common: 发起支付宝请求 * Author: wu-hui * Time: 2022/12/28 17:31 * @param $api * @param array $params * @param array $textParams * @return mixed|string */ public function requestApi($api, $params = [], $textParams = []) { try { $result = Factory::util() ->generic() ->agent($this->appAuthToken) ->execute($api, $textParams, $params); return json_decode($result->httpBody, true); } catch (\Exception $e) { return $e->getMessage(); } } /*** * 验签 * @param $param * @return bool */ public function verifySgin($param) { $res = Factory::payment()->common()->verifyNotify($param); return $res; } /*** * 签名 * @param $param * @return bool */ public function encrypt($param) { $res = Factory::Util()->AES()->encrypt($param); return $res; } /*** * 查询小程序信息 * @param $order_no * @param $appAuthToken * @return mixed|string */ public function miniQuery($order_no, $appAuthToken) { try { $biz_content['order_no'] = $order_no; $result = Factory::util()->generic() ->agent($appAuthToken) ->execute('alipay.open.mini.isv.query', [], $biz_content); return json_decode($result->httpBody, true)['alipay_open_mini_isv_query_response']; } catch (\Exception $e) { return $e->getMessage(); } } /*** * 查询订购订单 * @param $commodity_order_id * @param int $start_page * @return mixed|string */ public function queryServiceOrder($commodity_order_id, $start_page = 1) { try { $biz_content['commodity_order_id'] = $commodity_order_id; $biz_content['start_page'] = $start_page; $result = Factory::util()->generic() ->execute('alipay.open.servicemarket.order.query', [], $biz_content); return json_decode($result->httpBody, true)['alipay_open_servicemarket_order_query_response']; } catch (\Exception $e) { return $e->getMessage(); } } /*** * 查询订购订单 * @param $commodity_order_id * @param int $start_page * @return mixed|string */ public function MiniCreate($biz_content) { try { $result = Factory::util() ->generic() ->execute('alipay.open.mini.isv.create', [], $biz_content); return json_decode($result->httpBody, true)['alipay_open_mini_isv_create_response']; } catch (\Exception $e) { return $e->getMessage(); } } /*** * 设置小程序基础信息 * @param $textParams * @return mixed|string */ public function miniSetBaseinfo($textParams, $app_logo) { $fileParams = [ 'app_logo' => $app_logo, ]; try { $result = Factory::util() ->generic() ->agent($this->appAuthToken) ->fileExecute("alipay.open.mini.baseinfo.modify", $textParams, [], $fileParams); return json_decode($result->httpBody, true)['alipay_open_mini_baseinfo_modify_response']; } catch (\Exception $e) { return $e->getMessage(); } } /** * 订单发货 * @param $param * @return array * @throws \GuzzleHttp\Exception\GuzzleException */ public function sendDelivery($biz_content) { try { $result = Factory::util()->generic() ->agent($this->appAuthToken) ->execute('alipay.open.mini.order.delivery.send', [], $biz_content); return json_decode($result->httpBody, true)['alipay_open_mini_order_delivery_send_response']; } catch (\Exception $e) { return $e->getMessage(); } } /** * 订单收货 * @param $param * @return array * @throws \GuzzleHttp\Exception\GuzzleException */ public function recieveDelivery($biz_content) { try { $result = Factory::util()->generic() ->agent($this->appAuthToken) ->execute('alipay.open.mini.order.delivery.receive', [], $biz_content); return json_decode($result->httpBody, true)['alipay_open_mini_order_delivery_receive_response']; } catch (\Exception $e) { return $e->getMessage(); } } /*** * 查询订单信息 * @param $order_no * @param $openid * @return mixed|string */ public function miniOrderQuery($order_no, $openid) { try { $biz_content['out_order_id'] = $order_no; $biz_content['user_id'] = $openid; $result = Factory::util()->generic() ->agent($this->appAuthToken) ->execute('alipay.open.mini.order.query', [], $biz_content); return json_decode($result->httpBody, true)['alipay_open_mini_order_query_response']; } catch (\Exception $e) { return $e->getMessage(); } } /*** * 下单前安全检查 * @return void */ public function PaySecurityCheck() { $config = new Config(); $app_info = $config->getAppConfig($this->site_id)['data']['value']; $info = cache($this->appAuthToken . '_baseinfo'); //验证客服电话 if (empty($info) || !isset($app_info['service_phone'])) { $baseinfo = $this->requestApi('alipay.open.mini.baseinfo.query')['alipay_open_mini_baseinfo_query_response']; cache($this->appAuthToken . '_baseinfo', $baseinfo, 600); if ($baseinfo['code'] == 10000 && $baseinfo['service_phone']) { if (in_array($baseinfo['service_phone'], ['13800000001', '13800138000']) || $baseinfo['service_phone'] == '') { return $this->error('', '商家客服热线异常'); } else { $app_info['service_phone'] = $baseinfo['service_phone']; $app_original = $app_info['app_original']; $config->setAlipayConfig($app_info['appid'], $app_info, $this->site_id, $app_original); } } } else { if (in_array($app_info['service_phone'], [13800000001, 13800138000])) { return $this->error('', '商家客服热线异常'); } } //检查商家是否有维权 $trade_complain_infos = cache($this->appAuthToken . 'trade_complain_infos'); if ($trade_complain_infos) return $this->error('', '维权投诉待处理'); //判断商家是否无维权 $no_trade_complain_infos = cache($this->appAuthToken . 'no_trade_complain_infos'); if ($no_trade_complain_infos) return $this->success('无异常'); //验证售后 $condition = [ 'page_num' => 1, 'page_size' => 10, 'status' => 'MERCHANT_PROCESSING', ]; $request = $this->requestApi('alipay.merchant.tradecomplain.batchquery', $condition); $res = $request['alipay_merchant_tradecomplain_batchquery_response']; if ($res['code'] == 10000 && isset($res['trade_complain_infos'])) { cache($this->appAuthToken . 'trade_complain_infos', count($res['trade_complain_infos']), 300); cache($this->appAuthToken . 'no_trade_complain_infos', null); return $this->error('', '维权投诉待处理'); } else { cache($this->appAuthToken . 'trade_complain_infos', null); cache($this->appAuthToken . 'no_trade_complain_infos', 1, 7200); } return $this->success('无异常'); } public function getCompanyList() { $json = file_get_contents(__DIR__ . '/alikd.json'); return json_decode($json, true); } /** * Common: 发起支付宝请求 * @param $api * @param array $params * @param array $textParams * @return mixed|string */ public function imageUpload($imageName, $imageFilePath, $isCache = false) { try { if ($isCache && cache(md5($imageName))) { $data = json_decode(cache(md5($imageName)), true); return $data; } $result = Factory::base() ->image() ->agent($this->appAuthToken) ->upload($imageName, $imageFilePath); if ($isCache) { $data = json_decode($result->httpBody, true); cache(md5($imageName), json_encode($data)); return $data; } return json_decode($result->httpBody, true); } catch (\Exception $e) { return $e->getMessage(); } } public function getUserPhoneNumber($param) { try { if (!isset($param['sign'])) return $this->error([], '商户未获得手机号接口权限'); $encryptedData = $param['sign']; //2. 发起API调用(以支付能力下的统一收单交易创建接口为例) $result = Factory::util() ->AES() ->agent($this->appAuthToken) ->decrypt($encryptedData); return json_decode($result, true); } catch (\Exception $e) { return $this->error([], $e->getMessage()); } } }