| 
					
				 | 
			
			
				@@ -1,8 +1,10 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 package com.fs.course.service.impl; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import cn.binarywang.wx.miniapp.api.WxMaService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import cn.hutool.core.util.IdUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import cn.hutool.json.JSONUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.alibaba.fastjson.JSON; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.alibaba.fastjson.JSONObject; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.fs.common.core.domain.R; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.fs.common.utils.DateUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.fs.common.utils.StringUtils; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -23,17 +25,29 @@ import com.fs.course.service.IFsCourseLinkService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.fs.qw.domain.QwUser; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.fs.qw.mapper.QwUserMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.fs.system.service.ISysConfigService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.fs.wx.miniapp.config.WxMaConfiguration; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import lombok.Synchronized; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import lombok.extern.slf4j.Slf4j; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import me.chanjar.weixin.common.error.WxErrorException; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.apache.http.HttpEntity; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.apache.http.client.ClientProtocolException; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.apache.http.client.methods.HttpPost; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.apache.http.entity.StringEntity; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.apache.http.impl.client.CloseableHttpClient; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.apache.http.impl.client.HttpClients; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.apache.http.util.EntityUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.checkerframework.checker.units.qual.A; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.beans.BeanUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.beans.factory.annotation.Autowired; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.stereotype.Service; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.transaction.annotation.Transactional; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.io.IOException; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.io.UnsupportedEncodingException; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.net.URI; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.net.URLDecoder; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.net.URLEncoder; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.nio.charset.StandardCharsets; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.security.SecureRandom; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.time.LocalDateTime; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.time.ZoneId; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -289,6 +303,93 @@ public class FsCourseLinkServiceImpl implements IFsCourseLinkService 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 获取跳转微信小程序的链接地址 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param linkStr 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public String getGotoWxAppLink(String linkStr,String appId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        CloseableHttpClient client = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            client = HttpClients.createDefault(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            String[] split = linkStr.split("\\?"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (split.length == 2 && split[0].length() > 0 && split[1].length() > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //处理页面路径 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                String pageUrl = split[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (pageUrl.startsWith("/")) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    pageUrl = pageUrl.substring(1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //处理参数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                String query = split[1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                query = URLEncoder.encode(query, StandardCharsets.UTF_8.toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                String json = configService.selectConfigByKey("course.config"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                CourseConfig config = JSON.parseObject(json, CourseConfig.class); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                String miniprogramAppid = config.getMiniprogramAppid(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (StringUtils.isBlank(miniprogramAppid)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    return "未配置点播小程序id"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                if(StringUtils.isBlank(code)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                    return "参数错误,请传入code"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //获取微信token 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                final WxMaService wxService = WxMaConfiguration.getMaService(appId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                String token = wxService.getAccessToken(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                HttpPost httpPost = new HttpPost("https://api.weixin.qq.com/wxa/generate_urllink?access_token=" + token); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                JSONObject bodyObj = new JSONObject(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                bodyObj.put("path", pageUrl); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                bodyObj.put("query", query); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                log.info("微信小程序请求参数打印:{}", bodyObj.toJSONString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                StringEntity entity = new StringEntity(bodyObj.toJSONString(),"UTF-8"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                httpPost.setEntity(entity); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                httpPost.setHeader("Content-type", "application/json"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                HttpEntity response = client.execute(httpPost).getEntity(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                String responseString = EntityUtils.toString(response); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                log.info("微信小程序接口响应数据:{}", responseString); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                JSONObject jsonObject = JSONObject.parseObject(responseString); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(null != jsonObject && !jsonObject.isEmpty() && jsonObject.containsKey("url_link")){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    return jsonObject.getString("url_link"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return "页面链接错误,获取失败"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } catch (WxErrorException e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throw new RuntimeException(e); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } catch (ClientProtocolException e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throw new RuntimeException(e); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } catch (IOException e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            throw new RuntimeException(e); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        String json = configService.selectConfigByKey("course.config"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        CourseConfig config = JSON.parseObject(json, CourseConfig.class); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        String miniprogramAppid = config.getMiniprogramAppid(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        if (StringUtils.isBlank(miniprogramAppid)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                    return "未配置点播小程序id"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+////        String envVersion = "trial"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+////        String envVersion = version; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        if (StringUtils.isNotBlank(linkStr)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            //解析pageLink 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            String[] split = linkStr.split("\\?"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            if (split.length == 2 && split[0].length() > 0 && split[1].length() > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                //处理页面路径 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                String pageUrl =split[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                if(pageUrl.startsWith("/")){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                    pageUrl = pageUrl.substring(1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                //处理参数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                String query = split[1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+////                query = query.replace("\\u003d", "="); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                String wxAppLink = getWxAppLink(miniprogramAppid, pageUrl, query); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                return wxAppLink; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//                return "页面链接错误,获取失败"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public R createLinkUrlWc(FsCourseLinkCreateParam param) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |