jh-admin/addon/aliapp/model/MinCode.php

458 lines
16 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace addon\aliapp\model;
use app\model\BaseModel;
use Alipay\EasySDK\Kernel\Factory;
use Alipay\EasySDK\Kernel\Config as AliSdkCon;
class MinCode extends BaseModel
{
public $app;
public $config;
public $uconfig;
public $platform;
public $appAuthToken = '';//'202301BB74ac1b3e3b5f4541b174febbaf07bX84';
public $site_id = '';
public function __construct($site_id = '')
{
// 获取支付宝支付参数(统一支付到平台账户)
$config_model = new Config();
$this->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());
}
}
}