后台生成小程序分享二维码

时间:2024-02-29 21:20:34

java 后台生成微信小程序分享二维码

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.Map;


/**
 * 2019/8/10
 */
public class QrCodeUtil {

    /**
     * 向指定URL发送GET方法的请求 获取 accessToken
     * @param url
     * 发送请求的URL
     */
    public static String get(String url) {
        String result = "";
        BufferedReader in = null;
        try {
            URL realUrl = new URL(url);
            // 打开和URL之间的连接
            URLConnection connection = realUrl.openConnection();
            // 设置通用的请求属性
            connection.setRequestProperty("accept", "*/*");
            connection.setRequestProperty("connection", "Keep-Alive");
            connection.setRequestProperty("user-agent",
                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            // 建立实际的连接
            connection.connect();
//            // 获取所有响应头字段
//            Map<String, java.util.List<String>> headerFields = connection.getHeaderFields();
//            // 遍历所有的响应头字段
//            for (String key : headerFields.keySet()) {
//                System.out.println(key + "--->" + headerFields.get(key));
//            }
            // 定义 BufferedReader输入流来读取URL的响应
            in = new BufferedReader(new InputStreamReader(
                    connection.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            System.out.println("发送GET请求出现异常!" + e);
           // e.printStackTrace();
        }
        // 使用finally块来关闭输入流
        finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        return result;
    }
    public static String postWriteImage(String sceneStr, String accessToken,String base) {
        RestTemplate rest = new RestTemplate();
        InputStream inputStream = null;
        OutputStream outputStream = null;
        String PA1=IdGen.uuid()+".jpg";
        String PA=base+"/"+ PA1;
        try {
            String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="+accessToken;
            Map<String,Object> param = new HashMap<>();
            param.put("scene", sceneStr);
            param.put("page", "");
            param.put("width", 256);
            param.put("auto_color", false);
            Map<String,Object> line_color = new HashMap<>();
            line_color.put("r", 0);
            line_color.put("g", 0);
            line_color.put("b", 0);
            param.put("line_color", line_color);
            //  LOG.info("调用生成微信URL接口传参:" + param);
            MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
            HttpEntity requestEntity = new HttpEntity(param, headers);
            ResponseEntity<byte[]> entity = rest.exchange(url, HttpMethod.POST, requestEntity, byte[].class, new Object[0]);
           // System.out.println("调用小程序生成微信永久小程序码URL接口返回结果:" + entity.getBody());
            byte[] result = entity.getBody();
//            System.out.println(Base64.encodeBase64String(result));
            inputStream = new ByteArrayInputStream(result);
            File pFile = new File(base);
            if (!pFile.exists()) {
                pFile.mkdirs();
            }
            outputStream = new FileOutputStream(PA);
            int len = 0;
            byte[] buf = new byte[1024];
            while ((len = inputStream.read(buf, 0, 1024)) != -1) {
                outputStream.write(buf, 0, len);
            }
            outputStream.flush();
        } catch (Exception e) {
            //  LOG.error("调用小程序生成微信永久小程序码URL接口异常",e);
        } finally {
            if(inputStream != null){
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(outputStream != null){
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return PA1;
    }
}

Service 层

import com.alibaba.fastjson.JSONObject;
import com.hwj.pjname.common.utils.IdGen;
import com.hwj.pjname.common.utils.WeChat.QrCodeUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.context.annotation.ScopedProxyMode;
import org.springframework.stereotype.Service;

import java.util.UUID;

/**
 * 2019/8/1
 * 生成含有商户Id的分享码
 */
@Service
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)
public class QrcodeShareService {
    @Value("${basicsUploadPath}")
    String base;
    public String writeShopImage(String shopId,String appid,String secret){

    //       首先获取AccessToken 调用的凭证
    String res="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appid+"&secret="+secret;
    String token  = QrCodeUtil.get(res);
    JSONObject jsontoken = JSONObject.parseObject(token);
//        if(!jsontoken.get("errcode").equals("0")){
//        System.out.println("请求凭证失败");
//        return "";
//    }
    token= jsontoken.getString("access_token");
      //  System.out.println("获取到的凭证信息"+token);

    //String Path = base+"//"+IdGen.uuid()+".png";
    //你的json数据 ,格式不要错
//    String json = "{\"scene\":\""+shopId+"\","+
//            "\"page\":"+""+","+
//            "\"width\":85" +
//            "}";
//    System.out.println("json: "+json);
        return  QrCodeUtil.postWriteImage(shopId, token, base);

    }

}

controller层

@RestController
public class testController {
    @Autowired
    QrcodeShareService qrcodeShareService;

    @PostMapping("/123")
    public void test(HttpServletRequest request, HttpServletResponse response, String shopId) {
        String str = qrcodeShareService.writeShopImage(shopId, "申请的appid", "自己申请的secret");
        System.out.println("wxf679409476756da2" + str);

    }
}

我用的是微信的c接口可以生成不限制数量的分享码

python 生成微信二维码

 url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s" % (APP_ID, SECRET)
    res = requests.get(url=url)
    access_token = eval(res.text).get("access_token")
    print(access_token)
    url = \'https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=%s\' % access_token

    data = {
        \'scene\': "%s-%s" % (shopid,2),
        \'page\': \'pages/auth/auth\',
        \'width\':256
    }
    params_string = json.dumps(data)
    res = requests.post(url=url, data=params_string, verify=False)
    t = datetime.datetime.now()
    num = random.randint(1000, 9999)


    with open(BASE_DIR + \'/static/Wcode/\' + t.strftime("%Y-%m-%d-%H-%M-%S") + str(num) + ".jpg",
              \'wb\') as f:
        f.write(res.content)
    return "static/Wcode/" + t.strftime("%Y-%m-%d-%H-%M-%S") + str(num) + ".png"

 注意:生成的二维码要等小程序发布不然前端获取不到二维码传递过来的参数。