admin/addon/aliapp/model/AliPayApplet.php

534 lines
21 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 think\Exception;
use think\facade\Db;
use app\model\NewBaseModel;
/**
* Common: 支付宝小程序相关操作
* Author: wu-hui
* Time: 2022/12/29 15:10
* Class AliPayApplet
* @package addon\aliapp\model
*/
class AliPayApplet extends BaseModel{
protected $site_id;
// 小程序模板信息
private $templateInfo = [];
// 小程序投放的端com.alipay.alipaywallet=支付宝端。com.alipay.iot.xpaas=支付宝IoT端。
private $bundle_id = 'com.alipay.alipaywallet';
public function __construct($siteId){
$this->site_id = $siteId;
$this->templateInfo=config('alipay.templateInfo');
}
/**
* Common: 小程序发布记录 查询集合
* Author: wu-hui
* Time: 2022/12/29 18:38
* @return Db
*/
private function appletReleaseSelectCollection($type){
return Db::name('applet_release')
->where('site_id',$this->site_id)
->where('type',$type);
}
/**
* Common: 获取已发布的最新版本
* Author: wu-hui
* Time: 2023/01/03 16:41
* @return string
*/
public function newestVersion():string{
$version = (string)$this->appletReleaseSelectCollection(1)
->order(['create_time'=>'desc','id'=>'desc'])
->value('version');
return !empty($version) ? $version : '0.0.0';
}
/**
* Common: 判断:当前版本是否为最新版本
* Author: wu-hui
* Time: 2023/01/03 17:07
* @return bool
*/
public function isNewestVersion():bool{
$version = (string) config('alipay.templateInfo.template_version');// 当前系统版本
$newestVersion = (string)$this->newestVersion();// 最新版本
return (boolean)version_compare($version, $newestVersion, '>');
}
/**
* Common: 发布流程处理 —— 开始处理
* Author: wu-hui
* Time: 2023/01/04 10:49
* @param $type
* @param $id
* @return array
*/
public function publishingInit($type,$id){
try{
// 根据操作类型获取对应信息
$config = $this->publishingConfig($type);
[$params,$textParams] = $this->publishingParams($type,$id);
// 发起请求
$result = (new MinCode($this->site_id))->requestApi($config['api'], $params,$textParams);
$result = $result[$config['result_key']] ?? ['code' => 0];
if($result['code'] == 10000) {
$res = $this->resultProcessing($type,$id,$result);
if($res) return success(0,$res);
else return $this->success();
}else{
return $this->error('',$result['sub_msg']);
}
}catch(\Exception $e){
return $this->error('',$e->getMessage());
}
}
/**
* Common: 发布流程处理 —— 根据操作类型获取配置信息
* Author: wu-hui
* Time: 2023/01/04 10:09
* @param $type
* @return string[]
* @throws Exception
*/
private function publishingConfig($type):array{
$list = [
'delete' => [
'api' => 'alipay.open.mini.version.delete', // 请求接口
'result_key' => 'alipay_open_mini_version_delete_response',// 返回结果字段名称
],
'release_experience_version' => [
'api' => 'alipay.open.mini.experience.create',
'result_key' => 'alipay_open_mini_experience_create_response',
],
'cancel_experience_version' => [
'api' => 'alipay.open.mini.experience.cancel',
'result_key' => 'alipay_open_mini_experience_cancel_response',
],
'see_experience_version' => [
'api' => 'alipay.open.mini.experience.query',
'result_key' => 'alipay_open_mini_experience_query_response',
],
'audit_submit' => [
'api' => 'alipay.open.mini.version.audit.apply',
'result_key' => 'alipay_open_mini_version_audit_apply_response',
],
'audit_cancel' => [
'api' => 'alipay.open.mini.version.audit.cancel',
'result_key' => 'alipay_open_mini_version_audit_cancel_response',
],
'audited_cancel' => [
'api' => 'alipay.open.mini.version.audited.cancel',
'result_key' => 'alipay_open_mini_version_audited_cancel_response',
],
'version_online' => [
'api' => 'alipay.open.mini.version.online',
'result_key' => 'alipay_open_mini_version_online_response',
],
'version_gray_online' => [
'api' => 'alipay.open.mini.version.gray.online',
'result_key' => 'alipay_open_mini_version_gray_online_response',
],
'version_gray_cancel' => [
'api' => 'alipay.open.mini.version.gray.cancel',
'result_key' => 'alipay_open_mini_version_gray_cancel_response',
],
'version_offline' => [
'api' => 'alipay.open.mini.version.offline',
'result_key' => 'alipay_open_mini_version_offline_response',
],
'version_rollback' => [
'api' => 'alipay.open.mini.version.rollback',
'result_key' => 'alipay_open_mini_version_rollback_response',
],
'version_upload' => [
'api' => 'alipay.open.mini.version.upload',
'result_key' => 'alipay_open_mini_version_upload_response',
],
];
if($list[$type]) return $list[$type];
else throw new Exception('无效的操作!');
}
/**
* Common: 发布流程处理 —— 根据操作类型生成接口请求参数
* Author: wu-hui
* Time: 2023/01/04 10:32
* @param $type
* @param $id
* @return array[]
* @throws Exception
*/
private function publishingParams($type,$id){
$params = $textParams = [];
// 根据类型进行对应的操作
switch($type){
case 'delete':
case 'release_experience_version':
case 'cancel_experience_version':
case 'see_experience_version':
case 'audit_cancel':
case 'audited_cancel':
case 'version_online':
case 'version_gray_cancel':
case 'version_offline':
case 'version_rollback':
$params = [
'app_version' => $this->getVersion($id),
'bundle_id' => $this->bundle_id,
];
break;
case 'audit_submit':
$version = $this->getVersion($id);
$textParams = [
'region_type' => 'CHINA',
'version_desc' => "发布{$version}版本",
'app_version' => $version, //开发版本 模板ID
'bundle_id' => $this->bundle_id,
'speed_up' => 'false',
'auto_online' => 'auto_online'
];
break;
case 'version_gray_online':
$params = [
'app_version' => $this->getVersion($id),
'gray_strategy' => 'p10',// 枚举支持p10、p30、p50
'bundle_id' => $this->bundle_id,
];
break;
case 'version_upload':
// 获取最新版本
$isNewestVersion = (new AliPayApplet($this->site_id))->isNewestVersion();
if(!$isNewestVersion) throw new Exception('当前版本为最新版本,请勿重复发布!');
// 获取默认门店id
$storeInfo =Db::name('store')
->where('site_id',$this->site_id)
->where('is_default',1)
->field('store_id,store_id,store_name')
->find();
if(empty($storeInfo)) throw new Exception('默认门店不存在,请添加后进行操作!');
// 判断:是否存在小程序配置信息
$hasAccount = Db::name('uni_account')->where('site_id',$this->site_id)->value('id');
if($hasAccount <= 0) throw new Exception('请先配置小程序!');
$ext = [
'extEnable' => true,
'ext' => [
'site_id' => $this->site_id,
'store_id' => $storeInfo['store_id'],
],
'window'=>[
'defaultTitle'=>$storeInfo['store_name']
],
];
$params = [
'template_version' => $this->templateInfo['template_version'],// 小程序模板版本号
'ext' => json_encode($ext),//自定义参数
'template_id' => $this->templateInfo['template_id'],// 小程序模板 APPID
'app_version' => $this->templateInfo['template_version'],//商家小程序版本号
'bundle_id' => $this->bundle_id,
];
break;
default:
throw new Exception('无效的操作!');
}
return [$params,$textParams];
}
/**
* Common: 发布流程处理 —— 根据id获取版本信息
* Author: wu-hui
* Time: 2023/01/04 10:18
* @param $id
* @return mixed
* @throws Exception
*/
private function getVersion($id){
$version = Db::name('applet_release')->where('id',$id)->value('version');
if(!$version) throw new Exception('版本不存在!');
return $version;
}
/**
* Common: 发布流程处理 —— 请求结果处理
* Author: wu-hui
* Time: 2023/01/04 10:46
* @param $type
* @param $id
* @param $result
* @return string
* @throws \think\db\exception\DbException
*/
private function resultProcessing($type,$id,$result){
$returnData = '';
switch($type){
case 'delete':
Db::name('applet_release')->where('id',$id)->delete();
break; // 删除版本
case 'release_experience_version':
$this->appletReleaseSelectCollection(1)->update(['is_experience_version'=>0]);
Db::name('applet_release')->where('id',$id)->update(['is_experience_version'=>1]);
break;// 发布体验版本
case 'cancel_experience_version':
Db::name('applet_release')->where('id',$id)->update(['is_experience_version'=>0]);
break;// 取消体验版发布
case 'see_experience_version':
$statusText = [
'expVersionPackged' => '体验版打包成功',
'expVersionPackaging' => '体验版打包中',
'notExpVersion' => '非体验版',
];
$returnData = $statusText[$result['status']];
break;// 体验版状态查看
case 'audit_submit':
Db::name('applet_release')->where('id',$id)->update(['version_status'=> 'AUDITING']);
break;// 提交审核
case 'audit_cancel':
case 'audited_cancel':
Db::name('applet_release')->where('id',$id)->update(['version_status'=> 'INIT']);
break;// 撤销审核 & 退回开发
case 'version_online':
Db::name('applet_release')->where('id',$id)->update(['version_status'=> 'RELEASE']);
break;//上架
case 'version_gray_online':
Db::name('applet_release')->where('id',$id)->update(['version_status'=> 'GRAY']);
break;//灰度上架
case 'version_gray_cancel':
Db::name('applet_release')->where('id',$id)->update(['version_status'=> 'WAIT_RELEASE']);
break;//结束灰度
case 'version_offline':
Db::name('applet_release')->where('id',$id)->update(['version_status'=> 'OFFLINE']);
break;// 下架
case 'version_rollback':
$this->versionSee($id);
break;// 回滚
case 'version_upload':
$version = config('alipay.templateInfo.template_version');
$data = [
'site_id' => $this->site_id,
'version' => $version,
'type' => 1,
'ali_create_status' => $result['create_status'],
'version_status' => 'INIT',
'create_time' => time(),
];
Db::name('applet_release')->insert($data);
break;// 发布新版本
}
return $returnData;
}
/**
* Common: 版本管理 —— 所有版本同步
* Author: wu-hui
* Time: 2022/12/30 9:58
* @return array
* @throws \Exception
*/
public function versionSynchronization(){
$params = [
'bundle_id' => $this->bundle_id,
// 版本状态INIT=开发中,AUDITING=审核中,AUDIT_REJECT=审核驳回,WAIT_RELEASE=待上架,BASE_AUDIT_PASS=准入不可营销,GRAY=灰度中,RELEASE=已上架,OFFLINE=已下架,AUDIT_OFFLINE: 已下架
'version_status' => 'INIT,AUDITING,AUDIT_REJECT,WAIT_RELEASE,BASE_AUDIT_PASS,GRAY,RELEASE,OFFLINE,AUDIT_OFFLINE',
];
$result = (new MinCode($this->site_id))->requestApi('alipay.open.mini.version.list.query', $params);
$result = $result['alipay_open_mini_version_list_query_response'];
if($result['code'] == 10000) {
// 同步版本信息
$appVersionInfos = $result['app_version_infos'] ?? [];
$hasList = $this->appletReleaseSelectCollection(1)->column('version','id');
$hasListIds = array_flip($hasList);
$insertData = [];
$updateData = [];
foreach($appVersionInfos as $val){
if(!in_array($val['app_version'],$hasList)){
$insertData[] = [
'site_id' => $this->site_id,
'version' => $val['app_version'],
'type' => 1,
'ali_create_status' => 0,
'version_status' => $val['version_status'],
'create_time' => strtotime($val['create_time']),
];
}else{
$updateData[] = [
'id' => $hasListIds[$val['app_version']],
'version_status' => $val['version_status'],
];
}
}
Db::name('applet_release')->insertAll($insertData);
(new NewBaseModel(['table_name'=>'applet_release']))->saveAll($updateData);
return $this->success();
}else{
return $this->error('',$result['sub_msg']);
}
}
/**
* Common: 版本管理 —— 查询小程序版本构建状态
* Author: wu-hui
* Time: 2022/12/29 17:45
* @param $version
* @param $id
* @return array|mixed
* @throws \think\db\exception\DbException
*/
public function versionBuildQuery($version,$id){
$params = [
'app_version' => $version,
'bundle_id' => $this->bundle_id,
];
$result = (new MinCode($this->site_id))->requestApi('alipay.open.mini.version.build.query', $params);
$result = $result['alipay_open_mini_version_build_query_response'];
if($result['code'] == 10000) {
Db::name('applet_release')->where('id',$id)->update(['ali_create_status'=>$result['create_status']]);
return $result['create_status'];
}else{
return $this->error('',$result['sub_msg']);
}
}
/**
* Common: 版本管理 —— 版本详情查询
* Author: wu-hui
* Time: 2022/12/30 16:54
* @param $id
* @return array
* @throws \think\db\exception\DbException
*/
public function versionSee($id){
$version = Db::name('applet_release')->where('id',$id)->value('version');
if(!$version) $this->error('','版本不存在!');
$params = [
'app_version' => $version,
'bundle_id' => $this->bundle_id,
];
$result = (new MinCode($this->site_id))->requestApi('alipay.open.mini.version.detail.query', $params);
$result = $result['alipay_open_mini_version_detail_query_response'];
if($result['code'] == 10000) {
Db::name('applet_release')->where('id',$id)->update(['version_status'=>$result['status']]);
return success(0,'版本详情',$result);
}else{
return $this->error('',$result['sub_msg']);
}
}
/**
* Common: 生成小程序推广二维码
* Author: wu-hui
* Time: 2023/01/03 14:12
* @return array
*/
public function qrcodeCreate(){
$cacheName = 'alipay_open_app_qrcode_create_response_'.$this->site_id;
// 缓存操作
$result = cache($cacheName);
if($result){
return $this->success($result);
}else{
// 获取默认门店id
$storeId = (int)Db::name('store')
->where('site_id',$this->site_id)
->where('is_default',1)
->value('store_id');
if($storeId <= 0) $this->error('','默认门店不存在,请添加后进行操作!');
$params = [
'url_param' => 'pages/index/index',// 访问页面路径
'query_param' => 'site_id='.$this->site_id.'&store_id='.$storeId,// 小程序的启动参数
'describe' => '小程序预览',//对应的二维码描述
'color' => '',
'size' => 'l',// 合成后图片的大小(s -- 8cm, m -- 12cm, l -- 30cm)
];
$result = (new MinCode($this->site_id))->requestApi('alipay.open.app.qrcode.create', $params);
$result = $result['alipay_open_app_qrcode_create_response'];
// 返回结果
if($result['code'] == 10000) {
cache($cacheName,$result);
return $this->success($result);
}else{
return $this->error('',$result['sub_msg']);
}
}
}
public function queryTestQrcode($version){
$params['app_version']=$version;
// (new MinCode($this->site_id))->requestApi('alipay.open.mini.experience.create', $params);
$result = (new MinCode($this->site_id))->requestApi('alipay.open.mini.experience.query', $params);
$result = $result['alipay_open_mini_experience_query_response'];
// 返回结果
if($result['code'] == 10000) {
return $this->success($result);
}else{
return $this->error('',$result['sub_msg']);
}
}
/**
* Common: 登录 —— 获取用户基本信息
* Author: wu-hui
* Time: 2023/01/05 13:33
* @param string $code
* @param string $grantType
* @param string $refreshToken
* @return array
*/
public function loginBaseInfo($code = '',$grantType = 'authorization_code',$refreshToken = ''){
// authorization_code=换取授权令牌access_tokenrefresh_token=刷新获取新授权令牌。
$textParams = [
'grant_type' => $grantType
];
if($grantType == 'refresh_token') $textParams['refresh_token'] = $refreshToken;
else if($grantType == 'authorization_code') $textParams['code'] = $code;
// 发起请求
$result = (new MinCode($this->site_id))->requestApi('alipay.system.oauth.token',[], $textParams);
$result = $result['alipay_system_oauth_token_response'] ?? $result['error_response'];
// 返回结果
if(array_key_exists('user_id',$result)) {
return $this->success($result);
}else{
return $this->error('',$result['sub_msg']);
}
}
/**
* Common: 登录 —— 获取用户详细信息
* Author: wu-hui
* Time: 2023/01/05 14:04
* @param $authToken
* @return array
*/
public function loginDetailsInfo($authToken){
// 发起请求
$result = (new MinCode($this->site_id))->requestMemberApi($authToken,'alipay.user.info.share');
$result = $result['alipay_user_info_share_response'] ?? $result['error_response'];
// 返回结果
if($result['code'] == 10000) {
return $this->success($result);
}else{
return $this->error('',$result['sub_msg']);
}
}
}