SmallProgramNotice.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. <?php
  2. namespace app\common\services\notice;
  3. use app\backend\modules\goods\models\Brand;
  4. use app\backend\modules\goods\services\BrandService;
  5. use app\common\components\BaseController;
  6. use app\common\helpers\PaginationHelper;
  7. use app\common\helpers\Url;
  8. use Illuminate\Support\Facades\DB;
  9. use app\common\models\MemberMiniAppModel;
  10. use app\common\helpers\Cache;
  11. /**
  12. * Created by PhpStorm.
  13. * Author: 芸众商城 www.yunzshop.com
  14. * Date: 2017/2/27
  15. * Time: 上午9:17
  16. */
  17. class SmallProgramNotice
  18. {
  19. protected $app_id;
  20. protected $app_secret;
  21. protected $get_token_url;
  22. public function __construct()
  23. {
  24. /**
  25. * 请在此处填写你的小程序 APPID和秘钥
  26. */
  27. $set = \Setting::get('plugin.min_app');
  28. $getTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?"; //获取token的url
  29. $WXappid = $set['key']; //APPID
  30. $WXsecret = $set['secret']; //secret
  31. $this->app_id = $WXappid; //"wxbe88683bd339aaf5";
  32. $this->app_secret = $WXsecret; //"fcf189d2a18002a463e7b675cea86c87";
  33. $this->get_token_url = 'https://api.weixin.qq.com/cgi-bin/token?'
  34. .'grant_type=client_credential&appid=%s&secret=%s';
  35. }
  36. /**
  37. * 微信获取 AccessToken
  38. */
  39. public function getAccessToken(){
  40. $access_token = Cache::remember('token', 120, function (){
  41. $access_token = $this->opGetAccessToken();
  42. return $access_token;
  43. });
  44. if(!$access_token){
  45. $this->return_err('获取access_token时异常,微信内部错误');
  46. }else{
  47. $this->return_data(['access_token'=>$access_token]);
  48. }
  49. }
  50. /**
  51. * 提取公共方法 - 获取 AccessToken
  52. * @return bool
  53. */
  54. public function opGetAccessToken(){
  55. $get_token_url = sprintf($this->get_token_url, $this->app_id,$this->app_secret);
  56. $result = self::curl_get($get_token_url);
  57. $wxResult = json_decode($result,true);
  58. if(empty($wxResult)){
  59. return false;
  60. }else{
  61. $access_token = $wxResult['access_token'];
  62. return $access_token;
  63. }
  64. }
  65. //获取消息通知分类
  66. public function getCategory()
  67. {
  68. $cat_url = 'https://api.weixin.qq.com/wxaapi/newtmpl/getcategory?access_token=%s';
  69. $access_token = self::opGetAccessToken();
  70. if ($access_token) {
  71. $cat_url = sprintf($cat_url,$access_token);
  72. $data = $this->curl_get($cat_url);
  73. return $data;
  74. }
  75. return false;
  76. }
  77. /**
  78. * 获取小程序模板库标题列表
  79. * TODO 没必要使用,小程序账号后台可以视图查看
  80. */
  81. public function getAllTemplateList($ids,$start,$limit){
  82. // $opUrl = 'https://api.weixin.qq.com/cgi-bin/wxopen/template/library/list?'
  83. // .'access_token=%s';
  84. // $rawPost = ['count'=>20,'offset'=>$offset];
  85. // $date = self::opTemplateData($opUrl,$rawPost,'getAllTemplateList');
  86. // return $date;
  87. $pubUrl = 'https://api.weixin.qq.com/wxaapi/newtmpl/getpubtemplatetitles?access_token=%s&ids=%s&start=%s&limit=%s';
  88. $access_token = self::opGetAccessToken();
  89. if ($access_token) {
  90. $pubUrl = sprintf($pubUrl, $access_token,$ids,$start,$limit);
  91. $data = $this->curl_get($pubUrl);
  92. return $data;
  93. }
  94. return false;
  95. }
  96. /**
  97. * 获取模板库某个模板标题下关键词库
  98. * TODO 没必要使用,小程序账号后台可以视图查看
  99. */
  100. public function getTemplateKey($tid){
  101. // $opUrl = "https://api.weixin.qq.com/cgi-bin/wxopen/template/library/get?access_token=%s";
  102. // $rawPost = ['id'=>$key];
  103. // $key_liset = $this->opTemplateData($opUrl,$rawPost,'getTemplateKey');
  104. // return $key_liset;
  105. $pubUrl = 'https://api.weixin.qq.com/wxaapi/newtmpl/getpubtemplatekeywords?access_token=%s&tid=%s';
  106. $access_token = self::opGetAccessToken();
  107. if ($access_token) {
  108. $pubUrl = sprintf($pubUrl, $access_token,$tid);
  109. $data = $this->curl_get($pubUrl);
  110. return $data;
  111. }
  112. return false;
  113. }
  114. /**
  115. * 删除模板
  116. * TODO 没必要使用,小程序账号后台可以视图查看
  117. */
  118. public function deleteTemplate($ids){
  119. // $opUrl = "https://api.weixin.qq.com/cgi-bin/wxopen/template/del?access_token=%s";
  120. // $rawPost = ['template_id'=>$key];
  121. // $key_liset = $this->opTemplateData($opUrl,$rawPost,'getTemplateKey');
  122. // return $key_liset;
  123. $pubUrl = 'https://api.weixin.qq.com/wxaapi/newtmpl/deltemplate?access_token=%s';
  124. $access_token = self::opGetAccessToken();
  125. if ($access_token) {
  126. $pubUrl = sprintf($pubUrl, $access_token);
  127. $rawPost = ['priTmplId'=>$ids];
  128. $data = $this->curl_post($pubUrl,$rawPost);
  129. $wxResult = json_decode($data,true);
  130. if($wxResult['errcode']){
  131. return ('deleteTemplate - Failed!:'.$wxResult['errmsg']);
  132. }else{
  133. return $wxResult;
  134. }
  135. return $data;
  136. }
  137. return false;
  138. }
  139. /**
  140. * 获取帐号下已存在的模板列表
  141. * TODO 没必要使用,小程序账号后台可以视图查看
  142. */
  143. public function getExistTemplateList(){
  144. // $opUrl = "https://api.weixin.qq.com/cgi-bin/wxopen/template/list?access_token=%s";
  145. // $rawPost = ['count'=>20,'offset'=>0];
  146. // return $this->opTemplateData($opUrl,$rawPost,'getExistTemplateList');
  147. $pubUrl = 'https://api.weixin.qq.com/wxaapi/newtmpl/gettemplate?access_token=%s';
  148. $access_token = self::opGetAccessToken();
  149. if ($access_token) {
  150. $pubUrl = sprintf($pubUrl, $access_token);
  151. $data = $this->curl_get($pubUrl);
  152. return $data;
  153. }
  154. return false;
  155. }
  156. public function getAddTemplate($tid,$keyword,$scene){
  157. // $opUrl = "https://api.weixin.qq.com/cgi-bin/wxopen/template/add?access_token=%s";
  158. // $rawPost = ['id'=>$id,'keyword_id_list'=>$keyword];
  159. //
  160. // return $this->opTemplateData($opUrl,$rawPost,'getAddTemplate');
  161. $pubUrl = 'https://api.weixin.qq.com/wxaapi/newtmpl/addtemplate?access_token=%s';
  162. $access_token = self::opGetAccessToken();
  163. if ($access_token) {
  164. $pubUrl = sprintf($pubUrl, $access_token);
  165. $postData = ['tid'=>$tid,'kidList'=>$keyword,'sceneDesc'=>$scene];
  166. $data = $this->curl_post($pubUrl,$postData);
  167. $wxResult = json_decode($data,true);
  168. if($wxResult['errcode']){
  169. return ('deleteTemplate - Failed!:'.$wxResult['errmsg']);
  170. }else{
  171. return $wxResult;
  172. }
  173. }
  174. return false;
  175. }
  176. /**
  177. * 提取公共方法 获取模板数据
  178. * @param string $opUrl
  179. * @param array $rawPost
  180. * @param string $method
  181. */
  182. public function opTemplateData($opUrl = '',$rawPost = [],$method = ''){
  183. $access_token = self::opGetAccessToken();
  184. if(!$access_token){
  185. return '获取 access_token 时异常,微信内部错误';
  186. }else{
  187. $templateUrl = sprintf($opUrl,$access_token);
  188. $listRes = self::curl_post($templateUrl,$rawPost);
  189. $wxResult = json_decode($listRes,true);
  190. if($wxResult['errcode']){
  191. return ($method.' - Failed!:'.$wxResult);
  192. }else{
  193. return $wxResult;
  194. }
  195. }
  196. }
  197. public function getOpenid($memberId){
  198. return MemberMiniAppModel::getFansById($memberId)->openid;
  199. }
  200. // public function sendTemplatePaySuccess(\Illuminate\Http\Request $request){
  201. // if ($request->isMethod('post')){
  202. // $openId =$this->getOpenid(\YunShop::request()['member']);//接受人open_id
  203. // $url = \YunShop::request()['url']; //跳转路径
  204. // $form_id = \YunShop::request()['form_id']; //类型
  205. // /*-------------------此为项目的特定业务处理---------------------------*/
  206. // $order_sn = '';
  207. // $orderModel = new OrderModel();
  208. // $sendTemplateData = $orderModel->getSendTemplateData($order_sn);
  209. // /*-----------以上数据 $sendTemplateData 可根据自己的实际业务进行获取-----*/
  210. // $rawPost = [
  211. // 'touser' => $openId ,
  212. // 'template_id' => 'yASr1SdzgV7_gRzKgqYI3t7um-3pIGXrpCcHUHVIJz4',
  213. // 'page'=>$url,
  214. // 'form_id' => $form_id,
  215. // 'data' => [
  216. // 'keyword1' => ['value' => $sendTemplateData['order_sn']],
  217. // 'keyword2' => ['value' => $sendTemplateData['pay_time']],
  218. // 'keyword3' => ['value' => $sendTemplateData['goodsMsg']],
  219. // 'keyword4' => ['value' => $sendTemplateData['order_amount']],
  220. // 'keyword5' => ['value' => $sendTemplateData['addressMsg']],
  221. // 'keyword6' => ['value' => $sendTemplateData['tipMsg']],
  222. // ]
  223. // ];
  224. //
  225. // $this->sendTemplate($rawPost,'sendTemplatePaySuccess');
  226. // }else{
  227. // return $this->return_err('Sorry,请求不合法');
  228. // }
  229. //
  230. // }
  231. /**
  232. * 错误返回提示
  233. * @param string $errMsg 错误信息
  234. * @param string $errMsg
  235. * @param array $data
  236. */
  237. protected function return_err($errMsg = 'fail',$data = array())
  238. {
  239. exit(json_encode(array('status' => 0, 'result' => $errMsg, 'data' => $data)));
  240. }
  241. /**
  242. * 正确返回
  243. * @param array $data 要返回的数组
  244. * @return json的数据
  245. */
  246. protected function return_data($data = array())
  247. {
  248. exit(json_encode(array('status' => 1, 'result' => 'success', 'data' => $data)));
  249. }
  250. /**
  251. * PHP 处理 post数据请求
  252. * @param $url 请求地址
  253. * @param array $params 参数数组
  254. * @return mixed
  255. */
  256. protected function curl_post($url,array $params = array()){
  257. //TODO 转化为 json 数据
  258. $data_string = json_encode($params);
  259. $ch = curl_init();
  260. curl_setopt($ch,CURLOPT_URL,$url);
  261. curl_setopt($ch,CURLOPT_HEADER,0);
  262. curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  263. curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,10);
  264. curl_setopt($ch,CURLOPT_POST,1);
  265. curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
  266. curl_setopt($ch,CURLOPT_POSTFIELDS,$data_string);
  267. curl_setopt($ch,CURLOPT_HTTPHEADER,
  268. array(
  269. 'Content-Type: application/json'
  270. )
  271. );
  272. $data = curl_exec($ch);
  273. curl_close($ch);
  274. return ($data);
  275. }
  276. /**
  277. * @param string $url get请求地址
  278. * @param int $httpCode 返回状态码
  279. * @return mixed
  280. */
  281. protected function curl_get($url,&$httpCode = 0){
  282. $ch = curl_init();
  283. curl_setopt($ch,CURLOPT_URL,$url);
  284. curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  285. //不做证书校验,部署在linux环境下请改位true
  286. curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
  287. curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,10);
  288. $file_contents = curl_exec($ch);
  289. $httpCode = curl_getinfo($ch,CURLINFO_HTTP_CODE);
  290. curl_close($ch);
  291. return $file_contents;
  292. }
  293. }