java通讯录小程序
Java做的一个小程序-随机点名器

Java做的一个小程序-随机点名器介绍随机点名器是一款使用Java编写的小程序,它主要用于在学生课堂上随机抽取学生姓名进行点名。
该程序可以通过命令行方式运行,而且它的使用非常简单,不需要任何的专业技能与知识。
功能特点随机点名器的主要功能是在学生课堂上进行学生姓名的随机抽取,以帮助老师完成课堂管理工作。
程序的具体功能特点如下:•支持添加学生姓名:程序可以通过用户输入学生姓名的方式,将其添加到学生库中。
•支持删除学生姓名:用户可以对已存在的学生进行删除操作。
•支持随机点名:程序可以随机抽取学生姓名,以完成点名的操作。
•支持列表显示:程序可以展示所有的学生姓名列表,以供用户查看。
使用说明系统要求随机点名器使用Java语言编写,因此用户需要先安装Java运行环境。
具体要求如下:•操作系统:Windows、Linux、MacOS等•Java版本:JRE 1.8或以上版本安装方法1.下载程序压缩包。
2.解压缩到用户指定的目录。
3.运行“run.bat”文件(Windows平台)或“run.sh”文件(Linux/MacOS平台)。
使用方法1.添加学生姓名:在命令行窗口中输入“add”命令,然后输入学生姓名进行添加。
2.删除学生姓名:在命令行窗口中输入“delete”命令,然后输入需要删除的学生姓名。
3.随机点名:在命令行窗口中输入“random”命令,程序将随机抽取一个学生姓名进行点名。
4.显示学生列表:在命令行窗口中输入“list”命令,程序将展示所有已经添加的学生姓名。
技术实现技术框架随机点名器采用Java语言编写,主要使用了JDK中的标准库,使用了Collection接口中的List、Set集合类、Random类等。
算法实现随机点名的算法实现主要通过Java中的Random类实现,随机整数范围为0到学生数量-1,通过集合类的索引访问随机抽取的学生姓名。
代码实现```Java import java.util.*;public class RandomPicker { private List students;public RandomPicker() {students = new ArrayList<String>();}public void add(String name) {students.add(name);}public void delete(String name) {students.remove(name);}public String random() {Random random = new Random();int index = random.nextInt(students.size());return students.get(index);}public void list() {int n = 1;for(String student : students) {System.out.println((n++) + \。
java与微信小程序实现websocket长连接

java与微信⼩程序实现websocket长连接本⽂实例为⼤家分享了java与微信⼩程序实现websocket长连接的具体代码,供⼤家参考,具体内容如下背景:需要在⼩程序实现地图固定坐标下实时查看消息java环境 :tomcat7 jdk1.71.javawebsocket 类package com.qs.util;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import .HttpURLConnection;import .URL;import java.util.concurrent.CopyOnWriteArraySet;import javax.websocket.*;import javax.websocket.server.ServerEndpoint;import erController;/*** @ServerEndpoint 注解是⼀个类层次的注解,它的功能主要是将⽬前的类定义成⼀个websocket服务器端,* 注解的值将被⽤于监听⽤户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端*/@ServerEndpoint("/websocket")public class WebSocketTest {//静态变量,⽤来记录当前在线连接数。
应该把它设计成线程安全的。
private static int onlineCount = 0;//concurrent包的线程安全Set,⽤来存放每个客户端对应的MyWebSocket对象。
若要实现服务端与单⼀客户端通信的话,可以使⽤Map来存放,其中Key可以为⽤户标识 private static CopyOnWriteArraySet<WebSocketTest> webSocketSet = new CopyOnWriteArraySet<WebSocketTest>();//与某个客户端的连接会话,需要通过它来给客户端发送数据private Session session;/*** 连接建⽴成功调⽤的⽅法* @param session 可选的参数。
java开发小程序登录功能

java开发⼩程序登录功能整体流程如下:- 1.获取code- 2.⽤步骤1获取到的临时code换取⽤户唯⼀标识OpenId和会话密钥 session_key- 3.获取⽤户⼿机号,进⾏登录请求参数:请求参数:属性类型默认值必填说明appid string是⼩程序 appIdsecret string是⼩程序 appSecretjs_code string是登录时获取的 codegrant_type string是授权类型,此处只需填写 authorization_code 返回值:属性类型说明openid string⽤户唯⼀标识session_key string会话密钥unionid string⽤户在开放平台的唯⼀标识符,在满⾜ UnionID 下发条件的情况下会返回,详见。
errcode number错误码errmsg string错误信息开发前准备(必须)appid:wx4c1d53****7a671appsecret:fc9f99c08dcb2a0****eb26376c65eae⼩程序代码:login.js// pages/login/login.wxml.jsconst app = getApp();Page({/*** 页⾯的初始数据*/data: {// 判断⼩程序的API,回调,参数,组件等是否在当前版本可⽤。
canIUse: wx.canIUse('button.open-type.getPhoneNumber'),wechat: '微信快捷登录',isShow: false},/*** ⽣命周期函数--监听页⾯加载*/onLoad: function (options) {// 从缓存中取⼿机号console.log("获取⼿机号!")try {var value = wx.getStorageSync('phoneNumber')if (value) { // 说明已登录跳转页⾯console.log("获取缓存:"+value)wx.navigateTo({url: '../login?param=' + value})}else{// 未登录显⽰微信授权页⾯this.setData({isShow: true})}} catch (e) {}// 解决第⼀次获取⼿机号失败问题wx.login({success: res => {if(res.code){console.log("code->", res.code)}}})},// 0.获取⼿机号授权getPhoneNumber: function(e) {// ⽤户拒绝授权if(e.detail.errMsg == "getPhoneNumber:fail user deny") {wx.showToast({icon: "none",title: '请允许获取⼿机号,否则功能不可⽤!',})return}// console.log("e->detail", e.detail)/// ⽤户允许授权// console.log("iv->", e.detail.iv); //包括敏感数据在内的完整⽤户信息的加密数据,需要解密// console.log("encryptedData->", e.detail.encryptedData); //加密算法的初始向量,解密需要⽤到/// 获取⼿机号// 1.获取临时登录凭证codewx.login({success: res => {if(res.code){this.code = res.code;console.log("code->", res.code)console.log("encryptedData->", encodeURIComponent(e.detail.encryptedData))console.log("iv->", e.detail.iv)this.getSessionKey(res.code, e.detail.encryptedData, e.detail.iv);}}})},// 2.访问登录凭证校验接⼝获取session_key(后续改成后台实现)getSessionKey: function(js_code, encryptedData, iv) {// 3. 解密获取⼿机号wx.request({url: 'http://localhost:8082/wechat/appletLogin',data: {'encryptedData': encodeURIComponent(encryptedData),//需要进⾏编码'iv': iv,'jscode': js_code},method: 'POST',header: {'content-type': 'application/json'}, // 设置请求的 headersuccess: function(data2) {console.log(data)if(data.resultCode == 200) {if(er.phone==undefined){// 获取⼿机号失败跳转到常规⽤户登录页⾯(通过webview)wx.navigateTo({url: '⽤户登录页'})return}// 存储数据到缓存wx.setStorage({key:"phoneNumber",data:er.phone})// 4.跳转页⾯}},fail: function(err) {console.log(err);wx.showToast({icon: "none",title: '获取⼿机号失败,请重试!',})}})},/*** ⽣命周期函数--监听页⾯初次渲染完成*/onReady: function () {},/*** ⽣命周期函数--监听页⾯显⽰*/onShow: function () {},/*** ⽣命周期函数--监听页⾯隐藏*/onHide: function () {},/*** ⽣命周期函数--监听页⾯卸载*/onUnload: function () {},/*** 页⾯相关事件处理函数--监听⽤户下拉动作*/onPullDownRefresh: function () {},/*** 页⾯上拉触底事件的处理函数*/onReachBottom: function () {},/*** ⽤户点击右上⾓分享*/onShareAppMessage: function () {}})login.json{"usingComponents": {}}login.wxml<!--pages/login.wxml--><view class="modal-mask" catchtouchmove="preventTouchMove" wx:if="{{isShow}}"></view> <view class="modal-dialog" wx:if="{{isShow}}"><view class="modal-content"><view><image src='../images/show.png' class='show'></image></view><!-- <view>绑定⼿机号</view><view>请先绑定⼿机号在进⾏此操作</view> --><button class="show" type="primary" lang="zh_CN"open-type='getPhoneNumber' bindgetphonenumber="getPhoneNumber" >微信⽤户⼀键登录</button></view></view>login.wxss/* pages/login/login.wxml.wxss */.show{display: block;border-radius: 8rpx;margin: 20rpx 20rpx 20rpx 20rpx;font-size: 35rpx;}.container{position: fixed; /*关键属性,设置为fixed*/display: flex;flex-direction: column;width: 100%;height: 100%;}后端代码WxLoginController.java@RestController@RequestMapping("/wechat")public class WxLoginController {private Logger logger = LoggerFactory.getLogger(WxLoginController.class);@AutowiredUserDao userDao;@Value("${wechat.appid}")private String appid;@Value("${wechat.appsecret}")private String appsecret;private Map<String, Object> userMap = new HashMap<>();public ResultBean appletLogin(String encryptedData, String iv, String jscode) {System.out.println(encryptedData);ResultBean resultBean = new ResultBean();// jscodeif (StringUtils.isEmpty(jscode)) {resultBean.setResultCode(-10001);resultBean.setResultMessage("鉴权失败!");return resultBean;}// signif (StringUtils.isEmpty(encryptedData)) {resultBean.setResultCode(-10001);resultBean.setResultMessage("鉴权失败!");return resultBean;}if(StringUtils.isBlank(iv)) {resultBean.setResultCode(-10002);resultBean.setResultMessage("鉴权失败!");return resultBean;}// 创建Httpclient对象CloseableHttpClient httpclient = HttpClients.createDefault();String resultString = "";CloseableHttpResponse response = null;String url =WxContants.url.replace(WxContants.APPID, appid).replace(WxContants.SECRET, appsecret).replace(WxContants.JSCODE, jscode);try {// 创建uriURIBuilder builder = new URIBuilder(url);URI uri = builder.build();// 创建http GET请求HttpGet httpGet = new HttpGet(uri);// 执⾏请求response = httpclient.execute(httpGet);// 判断返回状态是否为200if (response.getStatusLine().getStatusCode() == 200) {resultString = EntityUtils.toString(response.getEntity(), "UTF-8");}} catch (Exception e) {e.printStackTrace();}// 解析jsonJSONObject jsonObject = (JSONObject) JSONObject.parse(resultString);String session_key = jsonObject.getString("session_key");String openid = jsonObject.getString("openid");System.out.println("session_key:"+session_key + ",openid:"+openid);if (StringUtils.isEmpty(session_key)) {resultBean.setResultCode(-10003);resultBean.setResultMessage("获取sessionkey失败!");return resultBean;}// 解码try {encryptedData = URLDecoder.decode(encryptedData,"UTF-8");} catch (UnsupportedEncodingException e) {logger.error("encryptedData,decode失败!", e);resultBean.setResultCode(-10003);resultBean.setResultMessage("encryptedData,decode失败!");return resultBean;}String decryptData = WechatDecryptDataUtil.decryptData(encryptedData, session_key, iv); JSONObject userInfo = JSONObject.parseObject(decryptData);// 存⼊redis+数据库,判断是否存在redis中,存在直接从redis返回// 本地使⽤Map模拟if (!userMap.containsKey(openid)) {// 判断⽤户是否存在系统中String phoneNumber = userInfo.getString("phoneNumber");User user = userDao.findByPhone(phoneNumber);if (user == null) {resultBean.setResultCode(200);resultBean.setResultMessage("此⽤户不存在,请先注册!");return resultBean;}user.setOpenId(openid);userDao.save(user);userMap.put(openid, user);}User user = (User) userMap.get(openid);resultBean.setResultCode(200);resultBean.setResultMessage("成功!");resultBean.setData(user);return resultBean;}}UserDao.javapublic interface UserDao extends JpaRepository<User, Long> {User findByPhone(String phone);User findByOpenId(String openId);}User.java@Entity@Table(name = "user")public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String openId;private String phone;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getOpenId() {return openId;}public void setOpenId(String openId) {this.openId = openId;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}}WechatDecryptDataUtil.javapublic class WechatDecryptDataUtil {private static Logger logger = LogManager.getLogger(WechatDecryptDataUtil.class);public static void main(String[] args) {String result = decryptData("BLY05rL1qLzGdqn+m4s4KfnM9CbMCm2sTZmgIcUJUpoOVeZkKKYh06ATVm2BgX8HUsH1a93811fhwr70MTh2Pk2qw9rPBzvos3husUJdVfaZgBk3Afp6wNFS0/kcoyt+7q2eMrIHMe6wkc4J0hgbbkxdUwZag/pyKXwe4pUzSQfta7dfBHy3DLu+REvwHiDNf "C9Z59YjFkCDT8+9NQ3OxcA==","oOWTpbZ80evG/GQqRdUu3w==");System.out.println("result = " + result);}public synchronized static String decryptData(String encryptDataB64, String sessionKeyB64, String ivB64) {String res = null;try {res = new String(decryptOfDiyIV(Base64.decode(encryptDataB64),Base64.decode(sessionKeyB64),Base64.decode(ivB64)));} catch (Exception e) {logger.error("encryptDataB64:"+encryptDataB64+"\n"+"sessionKeyB64:"+sessionKeyB64+"\n"+"ivB64:"+ivB64);}return res;}private static final String KEY_ALGORITHM = "AES";private static final String ALGORITHM_STR = "AES/CBC/PKCS7Padding";private static Key key;private static Cipher cipher;private static void init(byte[] keyBytes) {// 如果密钥不⾜16位,那么就补⾜. 这个if 中的内容很重要int base = 16;if (keyBytes.length % base != 0) {int groups = keyBytes.length / base + (keyBytes.length % base != 0 ? 1 : 0);byte[] temp = new byte[groups * base];Arrays.fill(temp, (byte) 0);System.arraycopy(keyBytes, 0, temp, 0, keyBytes.length);keyBytes = temp;}// 初始化Security.addProvider(new BouncyCastleProvider());// 转化成JAVA的密钥格式key = new SecretKeySpec(keyBytes, KEY_ALGORITHM);try {// 初始化ciphercipher = Cipher.getInstance(ALGORITHM_STR, "BC");} catch (Exception e) {e.printStackTrace();}}/*** 解密⽅法** @param encryptedData 要解密的字符串* @param keyBytes 解密密钥* @param ivs ⾃定义对称解密算法初始向量 iv* @return 解密后的字节数组*/private static byte[] decryptOfDiyIV(byte[] encryptedData, byte[] keyBytes, byte[] ivs) {byte[] encryptedText = null;init(keyBytes);try {cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(ivs));encryptedText = cipher.doFinal(encryptedData);} catch (Exception e) {e.printStackTrace();}return encryptedText;}}WxContants.javapublic interface WxContants {String APPID = "APPID";String SECRET = "SECRET";String JSCODE = "JSCODE";String TRADE_TYPE = "JSAPI";String url = "https:///sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code";}。
微信小程序java登录授权解密获取unionId(填坑)

微信⼩程序java登录授权解密获取unionId(填坑)官⽅流程图:第⼀步:获取code说明:⼩程序调⽤wx.login() 获取临时登录凭证code ,并回传到开发者服务器。
开发者服务器以code换取⽤户唯⼀标识openid 和会话密钥session_key。
之后开发者服务器可以根据⽤户标识来⽣成⾃定义登录态,⽤于后续业务逻辑中前后端交互时识别⽤户⾝份。
//app.jsApp({onLaunch: function() {wx.login({success: function(res) {if (res.code) {//发起⽹络请求wx.request({url: 'https:///onLogin',data: {code: res.code}})} else {console.log('登录失败!' + res.errMsg)}}});}})关于unionId,这⾥需要说明⼀下,如果应⽤只限于⼩程序内则不需要unionId,直接通过openId可以确定⽤户⾝份,但是如果需要跨应⽤如:⽹页应⽤,app应⽤时则需要使⽤到unionId作为⾝份标识。
UnionID获取途径绑定了开发者帐号的⼩程序,可以通过下⾯3种途径获取UnionID。
调⽤接⼝wx.getUserInfo,从解密数据中获取UnionID。
注意本接⼝需要⽤户授权,请开发者妥善处理⽤户拒绝授权后的情况。
如果开发者帐号下存在同主体的公众号,并且该⽤户已经关注了该公众号。
开发者可以直接通过wx.login获取到该⽤户UnionID,⽆须⽤户再次授权。
如果开发者帐号下存在同主体的公众号或移动应⽤,并且该⽤户已经授权登录过该公众号或移动应⽤。
开发者也可以直接通过wx.login获取到该⽤户UnionID,⽆须⽤户再次授权。
说明完了,我们继续下⼀步,主要需要区分获得授权,和未获得授权情况第⼆步:通过code换取sessionKey等个⼈信息1、未获得授权注意:这⾥unionId如果满⾜上⾯2、3所说获取条件,则会在这⼀步⾥返回,如果不满⾜则需要调⽤wx.getUserInfo来获取,这个⽅法需要获得⽤户授权。
java解析小程序码

java解析小程序码小程序码是微信小程序的一种推广方式,用户可以通过扫描小程序码快速打开对应的小程序。
而在Java开发中,我们可以使用一些库来解析小程序码,从而获取相关的信息。
首先,我们需要引入相关的库。
在Java中,有很多开源的库可以用来解析小程序码,比如zxing、javase、jbarcode等。
这些库都提供了丰富的API,可以方便地解析小程序码。
接下来,我们需要获取小程序码的图片。
可以通过网络请求或者本地文件的方式获取小程序码的图片。
如果是网络请求,可以使用Java的HttpURLConnection或者HttpClient等库来发送请求并获取图片数据。
如果是本地文件,可以使用Java的FileInputStream来读取文件数据。
获取到小程序码的图片后,我们就可以使用相应的库来解析了。
以zxing为例,我们可以使用它提供的MultiFormatReader类来解析小程序码。
首先,我们需要将图片数据转换成Bitmap对象,然后将Bitmap对象转换成BinaryBitmap对象,最后使用MultiFormatReader的decode方法来解析。
解析后,我们可以获取到小程序码的内容。
小程序码的内容一般是一个URL,可以通过解析后的结果来获取。
我们可以使用正则表达式或者字符串处理的方式来提取URL。
除了获取小程序码的内容,我们还可以获取其他的信息,比如小程序码的宽度、高度、颜色等。
这些信息可以通过解析后的结果来获取。
在解析小程序码的过程中,我们还需要注意一些异常情况的处理。
比如图片解析失败、解析结果为空等情况,我们需要进行相应的处理,以保证程序的稳定性。
总结一下,Java解析小程序码可以通过引入相关的库来实现。
我们可以获取小程序码的图片,然后使用相应的库来解析。
解析后,我们可以获取小程序码的内容以及其他的信息。
在解析过程中,我们需要注意异常情况的处理,以保证程序的稳定性。
通过Java解析小程序码,我们可以方便地获取小程序码的相关信息,为小程序的推广和使用提供便利。
wxjava用法

wxjava用法
wxJava 是一个基于Java 语言的微信开发框架,可以帮助开发者快速开发微信小程序、公众号等。
下面是wxJava 的基本用法:
1.引入wxJava 库:将wxJava 库引入到项目中,可以通过Maven
或Gradle 等依赖管理工具进行引入。
2.创建wxJava 对象:在Java 代码中创建wxJava 对象,用于进行
微信操作。
3.登录微信:使用wxJava 对象的登录方法,获取登录凭证,用于
调用微信接口。
4.调用微信接口:使用登录凭证调用微信接口,获取用户信息、发
送消息、获取菜单等。
5.处理微信事件:通过监听器或回调接口处理微信事件,例如用户
点击菜单、发送消息等。
6.实现业务逻辑:根据具体业务需求,实现相应的业务逻辑。
7.返回结果给微信:将业务处理结果返回给微信,完成一次请求-
响应循环。
需要注意的是,使用wxJava 进行微信开发时需要遵循微信开放平台的相关规定和开发规范,确保接口调用合法、数据安全可靠。
同时,也需要根据具体业务需求进行定制化开发,以满足用户需求。
java微信小程序步数encryptedData和开放数据解密的实现

java微信⼩程序步数encryptedData和开放数据解密的实现前提:三个参数,1.sessionKey(拿openId的时候可以得到)2.encryptedData(前端提供)3.iv(前端提供)⼀个类,⼀个⽅法。
1.类:import java.nio.charset.Charset;import java.util.Arrays;/*** 微信⼩程序加解密* @author liuyazhuang**/public class WxPKCS7Encoder {private static final Charset CHARSET = Charset.forName("utf-8");private static final int BLOCK_SIZE = 32;/*** 获得对明⽂进⾏补位填充的字节.** @param count* 需要进⾏填充补位操作的明⽂字节个数* @return 补齐⽤的字节数组*/public static byte[] encode(int count) {// 计算需要填充的位数int amountToPad = BLOCK_SIZE - (count % BLOCK_SIZE);if (amountToPad == 0) {amountToPad = BLOCK_SIZE;}// 获得补位所⽤的字符char padChr = chr(amountToPad);String tmp = new String();for (int index = 0; index < amountToPad; index++) {tmp += padChr;}return tmp.getBytes(CHARSET);}/*** 删除解密后明⽂的补位字符** @param decrypted* 解密后的明⽂* @return 删除补位字符后的明⽂*/public static byte[] decode(byte[] decrypted) {int pad = decrypted[decrypted.length - 1];if (pad < 1 || pad > 32) {pad = 0;}return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad);}/*** 将数字转化成ASCII码对应的字符,⽤于对明⽂进⾏补码** @param a* 需要转化的数字* @return 转化得到的字符*/public static char chr(int a) {byte target = (byte) (a & 0xFF);return (char) target;}}2.⽅法:import java.io.UnsupportedEncodingException;import java.security.AlgorithmParameters;import java.security.InvalidAlgorithmParameterException;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;import java.security.Security;import java.security.spec.InvalidParameterSpecException;import java.util.HashMap;import javax.annotation.Resource;import javax.crypto.BadPaddingException;import javax.crypto.Cipher;import javax.crypto.IllegalBlockSizeException;import javax.crypto.NoSuchPaddingException;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;import mons.codec.binary.Base64;import ng3.StringUtils;import org.bouncycastle.jce.provider.BouncyCastleProvider;import lombok.extern.slf4j.Slf4j;@Slf4jpublic class AesCbcUtil {static {//BouncyCastle是⼀个开源的加解密解决⽅案,主页在/Security.addProvider(new BouncyCastleProvider());}/*** AES解密** @param data //密⽂,被加密的数据* @param key //秘钥* @param iv //偏移量* @param encodingFormat //解密后的结果需要进⾏的编码* @param type //0 是其他 1是微信步数* @return* @throws Exception*/public static String decrypt(String data, String key, String iv, String encodingFormat,Integer type) throws Exception { // initialize();if(StringUtils.isEmpty(data)||StringUtils.isEmpty(key)||StringUtils.isEmpty(iv))throw new SkyParamNullException("⼩程序获取⽤户信息参数不能为空");//被加密的数据byte[] dataByte = Base64.decodeBase64(data);//加密秘钥byte[] keyByte = Base64.decodeBase64(key);//偏移量byte[] ivByte = Base64.decodeBase64(iv);try {Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");parameters.init(new IvParameterSpec(ivByte));cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化byte[] resultByte = cipher.doFinal(dataByte);if (null != resultByte && resultByte.length > 0) {if (type==1){return new String(WxPKCS7Encoder.decode(resultByte));}else {return new String(resultByte, encodingFormat);}}return null;} catch (NoSuchAlgorithmException e) {e.printStackTrace();log.error("⼩程序解析出错1{}",e.getMessage());} catch (NoSuchPaddingException e) {e.printStackTrace();log.error("⼩程序解析出错2{}",e.getMessage());} catch (InvalidParameterSpecException e) {e.printStackTrace();log.error("⼩程序解析出错3{}",e.getMessage());} catch (InvalidKeyException e) {e.printStackTrace();log.error("⼩程序解析出错4{}",e.getMessage());} catch (InvalidAlgorithmParameterException e) {e.printStackTrace();log.error("⼩程序解析出错5{}",e.getMessage());} catch (IllegalBlockSizeException e) {e.printStackTrace();log.error("⼩程序解析出错6{}",e.getMessage());} catch (BadPaddingException e) {e.printStackTrace();log.error("⼩程序解析出错7{}",e.getMessage());}catch (UnsupportedEncodingException e) {e.printStackTrace();log.error("⼩程序解析出错8{}",e.getMessage());}return null;}}实现@ApiOperation(value = "wx步数解密")@PostMapping(value = "/decode")public ResultModel<Object> questionList(@RequestBody WxSportParam param) throws Exception {HashMap<String, Object> map = wxXiaoChenXuUtil.getWxOpenId(//这个⽅法⽹上很多,没有就⽤binarywang的param.getCode()//前端提供的code,sysProperties.getWxAppId()//appID,sysProperties.getWxAppSecret());//secretString sessionKey = map.get("session_key").toString();String result = AesCbcUtil.decrypt(param.getData(), sessionKey,param.getIv(), "UTF-8",1);return ResultModel.success(result);}出来的数据:{ “stepInfoList”: [{“timestamp”: 1445866601,“step”: 100},{“timestamp”: 1445876601,“step”: 120} ] }tips:如果是解析⽤户信息的话⼀样的⽤法,解密decrypt中参数type传0。
java生成微信小程序码~

java⽣成微信⼩程序码~主要分两种:⼀种适⽤于需要的码数量较少的业务场景。
通过该接⼝⽣成的⼩程序码,永久有效,有数量限制。
重点是只能直接定位到⼩程序中某个页⾯,不能传参数,所以这个pass。
⼀种适⽤于需要的码数量极多的业务场景。
通过该接⼝⽣成的⼩程序码,永久有效,数量暂⽆限制。
只不过每分钟调⽤次数有限,但是⼀分钟好5000次,这个⼤多数时候都不会超出,所以相当于⽆限制。
我们选择了第⼆种⽅式。
然後其实两种⽅法使⽤的时候都需要⼀个必须的参数:接⼝调⽤凭证——access_token.这个参数是由appId和secret⼀起获取的。
⾄于这两个参数怎么来的就没法再往下说了。
我今天的讲解从获取access_token开始:这个⽅法中的appId和secret是事先定义好的。
⽆论是静态变量还是配置⽂件中都可以。
public static String getAccessToken() throws Exception {String requestUrl ="https:///cgi-bin/token?grant_type=client_credential&appid="+appid+"&secret="+secret;URL url = new URL(requestUrl);// 打开和URL之间的连接HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("POST");// 设置通⽤的请求属性connection.setRequestProperty("Content-Type", "application/json");connection.setRequestProperty("Connection", "Keep-Alive");connection.setUseCaches(false);connection.setDoOutput(true);connection.setDoInput(true);// 得到请求的输出流对象DataOutputStream out = new DataOutputStream(connection.getOutputStream());out.writeBytes("");out.flush();out.close();// 建⽴实际的连接connection.connect();// 定义 BufferedReader输⼊流来读取URL的响应BufferedReader in = null;if (requestUrl.contains("nlp"))in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "GBK"));elsein = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));String result = "";String getLine;while ((getLine = in.readLine()) != null) {result += getLine;}in.close();JSONObject jsonObject = JSON.parseObject(result);String accesstoken=jsonObject.getString("access_token");return accesstoken;}这个⽅法就是⼀个简单的获取凭证。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MyEclipse环境下Java语言编写的通讯录元源代码上传于山东农业大学机房2010年12月21日望广大网友指出不足并加以改正//程序运行后出项的第一个窗口package pkg_2;import java.io.*;import java.awt.BorderLayout;import java.awt.Button;import java.awt.Frame;import java.awt.GridLayout;import bel;import java.awt.Panel;import java.awt.TextField;import java.awt.Window;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowEvent;import java.awt.event.WindowListener;public class address_book extends Frame implements WindowListener,ActionListener {private Panel pan_1,pan_2,pan_3;private Label lab_1;private Label lab_2;private Label lab_3;private Label lab_4;private TextField text_1;private TextField text_2;private Button but_1,but_2,but_3,but_4,but_5,but_6;private RandomAccessFile raf;address_book(){super("通讯录");//调用父类的构造函数setSize(320,220);//设置大小setLayout(new BorderLayout());//设置边界布局pan_1=new Panel();pan_1.setLayout(new GridLayout(2,2));pan_2=new Panel();pan_2.setLayout(new GridLayout(3,2));pan_3=new Panel();pan_3.setLayout(new GridLayout(2,1));lab_1=new Label("姓名");lab_2=new Label("手机号码");lab_3=new Label("注意:鉴于中英文在编码方式上的不同,所以请注意在");lab_4=new Label("输入姓名时请输入姓名的拼音,否则容易出错,后果自负!"); text_1=new TextField();text_2=new TextField();but_1=new Button("查询");but_1.addActionListener(this);but_2=new Button("添加");but_2.addActionListener(this);but_3=new Button("修改");but_3.addActionListener(this);but_4=new Button("删除");but_4.addActionListener(this);but_5=new Button("关闭");but_5.addActionListener(this);but_6=new Button("关于");but_6.addActionListener(this);pan_1.add(lab_1);pan_1.add(text_1);pan_1.add(lab_2);pan_1.add(text_2);pan_2.add(but_1);pan_2.add(but_2);pan_2.add(but_3);pan_2.add(but_4);pan_2.add(but_5);pan_2.add(but_6);pan_3.add(lab_3);pan_3.add(lab_4);add(pan_1,BorderLayout.NORTH);add(pan_2,BorderLayout.CENTER);add(pan_3,BorderLayout.SOUTH);addWindowListener(this);setVisible(true);}public void windowActivated(WindowEvent arg0) { // TODO Auto-generated method stub}public void windowClosed(WindowEvent arg0) { // TODO Auto-generated method stub}public void windowClosing(WindowEvent arg0) { Window w=(Window)arg0.getSource();setVisible(false);w.dispose();}public void windowDeactivated(WindowEvent arg0) { // TODO Auto-generated method stub}public void windowDeiconified(WindowEvent arg0) { // TODO Auto-generated method stub}public void windowIconified(WindowEvent arg0) { // TODO Auto-generated method stub}public void windowOpened(WindowEvent arg0) { // TODO Auto-generated method stub}public void actionPerformed(ActionEvent arg0) {String s_1=arg0.getActionCommand();if(s_1.equals("查询")){try{RandomAccessFile raf=new RandomAccessFile("c:\\address_book.txt","rw");String s1,s2;String s3=text_1.getText();//获取要查询人的姓名while(true){s1=raf.readUTF();raf.readChar();s2=raf.readUTF();raf.readChar();if(s1.equals(s3)){text_2.setText(s2);break;}}raf.close();}catch(IOException e){System.out.println(e);}}if(s_1.equals("添加")){try{File file_1=new File("c:\\address_book.txt");RandomAccessFile raf=new RandomAccessFile("c:\\address_book.txt","rw");String s1=text_1.getText();//获取要添加人的姓名String s2=text_2.getText();//获取要添加人的手机号码raf.seek(file_1.length());//文件指针定位与文件的结束的地方raf.writeUTF(s1);raf.writeChar('\t');raf.writeUTF(s2);raf.writeChar('\t');text_1.setText("");text_2.setText("");raf.close();}catch(IOException e){System.out.println(e);}}if(s_1.equals("修改")){try{long n=0;RandomAccessFile raf=new RandomAccessFile("c:\\address_book.txt","rw");raf.seek(0);String s1,s2;String s3=text_1.getText();//获取要修改的人的姓名String s4=text_2.getText();//获取要修改的人的电话号码while(true){s1=raf.readUTF();raf.readChar();s2=raf.readUTF();raf.readChar();n=s1.length()+s2.length()+8+n;if(s1.equals(s3)){raf.seek(n-4-s2.length());//文件指针移动到合适的位置raf.writeUTF(s4);//写入写入的时候会覆盖的break;}}text_1.setText("");text_2.setText("");raf.close();}catch(IOException e){System.out.println(e);}}if(s_1.equals("删除")){try{char c1,c2;long n=0;RandomAccessFile raf=new RandomAccessFile("c:\\address_book.txt","rw");raf.seek(0);String s1,s2;String s3=text_1.getText();//获取要删除人的姓名while(true){s1=raf.readUTF();//读出姓名raf.readChar();s2=raf.readUTF();//读出电话号码raf.readChar();n=s1.length()+s2.length()+8;if(s1.equals(s3)){int n1=s1.length();//求n1的长度int n2=s2.length();//求n2的长度raf.seek(n-8-n1-n2);//文件指针移动到合适的位置char ch_1[]=new char[n1];for(int i=0;i<n1;i++){ch_1[i]=' ';}//定义一个数组数组的长度时字符串n1的长度char ch_2[]=new char[n2];for(int j=0;j<n2;j++){ch_2[j]=' ';}//定义另外一个数组数组的长度是字符串n2的长度String s5=new String(ch_1);String s6=new String(ch_2);//定义两个字符串使得字符串的内容为上面两个字符数组的内容raf.writeUTF(s5);raf.writeChar('\t');raf.writeUTF(s6);raf.writeChar('\t');break;}}text_1.setText("");text_2.setText("");raf.close();}catch(IOException e){System.out.println(e);}}if(s_1.equals("关闭")){System.exit(0);}if(s_1.equals("关于")){setVisible(false);this.dispose();address_book_guanyu a=new address_book_guanyu();}}}//这是单机关于后出现的窗口package pkg_2;import java.awt.Button;import java.awt.Frame;import java.awt.GridBagLayout;import java.awt.GridLayout;import bel;import java.awt.Window;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowEvent;import java.awt.event.WindowListener;public class address_book_guanyu extends Frame implements ActionListener, WindowListener {Button but_1;Label lab_1,lab_2;address_book_guanyu(){super("关于");setSize(150, 100);setLayout(new GridLayout(3,1));but_1=new Button("确定");but_1.addActionListener(this);lab_1=new Label("版权所用,侵权不究");lab_2=new Label("联系方式QQ 949169896");add(lab_1);add(lab_2);add(but_1);addWindowListener(this);setVisible(true);}public void actionPerformed(ActionEvent arg0) { String s=arg0.getActionCommand();if(s.equals("确定")){setVisible(false);this.dispose();this.dispose();address_book a=new address_book();}// TODO Auto-generated method stub}public void windowActivated(WindowEvent arg0) { // TODO Auto-generated method stub}public void windowClosed(WindowEvent arg0) { // TODO Auto-generated method stub}public void windowClosing(WindowEvent arg0) { Window w=(Window)arg0.getSource();setVisible(false);w.dispose();}public void windowDeactivated(WindowEvent arg0) { // TODO Auto-generated method stub}public void windowDeiconified(WindowEvent arg0) { // TODO Auto-generated method stub}public void windowIconified(WindowEvent arg0) { // TODO Auto-generated method stub}public void windowOpened(WindowEvent arg0) { // TODO Auto-generated method stub}}//这是主函数package pkg_2;public class addressbook {public static void main(String[] args) {address_book add=new address_book();}}。