java微信开发官方文档地址:https://mp.weixin.qq.com/wiki/home/
开发微信付款和扫一扫,必须有内网穿透,最好有服务器
微信开发扫一扫开发过程:
// WeixinUtil.getAccess_token此工具类,将放在下面一点。
这里是一个类,开始
//方法开始。传入参数URL,这个URL,会做详细解释。
public Map<String, String> sign(String url) {
//如何获取access_token:
//后台得到access_token,访问方法内的地址appid=微信公众平台基本资料内。secret=微信公众平台基本资料内的appsecret
String aToken = WeixinUtil.getAccess_token("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=**************&secret=*******");
String[] tokenOne = aToken.split(":"); //此处是将返回参数进行一个拆分
String[] token = tokenOne[1].split(",");
char [] stringArr = token[0].toCharArray();
String token3 = "" ;
for(int i=1;i<stringArr.length-1;i++){
String token2 = String.valueOf(stringArr[i]);
token3 += token2;
} //token就是我们想要的数据了
//如何根据access_token得到jsapi_ticket
//访问方法内地址,其他参数固定,只需修改access_token,就是上面方法得到的参数
String jsapi_ticket =WeixinUtil.getAccess_token("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+token3+"&type=jsapi");
String[] jsapi1 = jsapi_ticket.split(":");//同样讲获得的参数进行一个拆分。
String[] jsapi2 = jsapi1[3].split(",");
char [] stringArray = jsapi2[0].toCharArray();
String ticket3 = "" ;
for(int i=1;i<stringArray.length-1;i++){
String ticket = String.valueOf(stringArray[i]);
ticket3 += ticket;
}
//signature----->签名生成方法。
String nonce_str = create_nonce_str(); //此处调用下面生成随机串的方法
String timestamp = create_timestamp(); //此处调用下面生成时间的方法
//新建一个MAP
Map<String, String> ret = new HashMap<String, String>();
String string1;
String signature = "";
//注意这里参数名必须全部小写,且必须有序
"&noncestr=" + nonce_str +
"×tamp=" + timestamp +
"&url=" + url; //此处的URL是方法是别处调用此方法,所传的参。
try {
MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
crypt.update(string1.getBytes("UTF-8")); //这里传入String1,转格式
signature = byteToHex(crypt.digest()); //此处调用下面随机加密的方法。赋值给signature
}
catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
//放值进入MAP。
ret.put("url", url);
ret.put("jsapi_ticket", ticket3);
ret.put("nonceStr", nonce_str);
ret.put("timestamp", timestamp);
ret.put("signature", signature);
ret.put("appId", 你的appid);
return ret;
}//方法结束
//timestamp---->时间戳生成方法。
/**
* 由程序自己获取当前时间
* @return
*/
private static String create_timestamp() {
return Long.toString(System.currentTimeMillis() / 1000);
}
//nonceStr ---->随机串生成方法。此处nonceStr中的S大写。
/**
* 产生随机串--由程序自己随机产生
* @return
*/
private static String create_nonce_str() {
return UUID.randomUUID().toString();
}
/**
* 随机加密
* @param hash
* @return
*/
private static String byteToHex(final byte[] hash) {
Formatter formatter = new Formatter();
for (byte b : hash){
formatter.format("%02x", b);
}
String result = formatter.toString();
formatter.close();
return result;
}
WeixinUtil工具类:
import java.net.HttpURLConnection;
import java.io.InputStream;
import java.net.URL;
//我的这个工具类,主要是java访问网址并接受参数,只是输入URL,上面就是调用此方法,不明白看上面传的参数。
public class WeixinUtil {
public static String getAccess_token(String url) {
String accessToken = null;
try {
URL urlGet = new URL(url);
HttpURLConnection http = (HttpURLConnection) urlGet
.openConnection();
http.setRequestMethod("GET"); // 必须是get方式请求
http.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
http.setDoOutput(true);
http.setDoInput(true);
System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒
System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒
http.connect();
InputStream is = http.getInputStream();
int size = is.available();
byte[] jsonBytes = new byte[size];
is.read(jsonBytes);
accessToken = new String(jsonBytes, "UTF-8");
System.out.println(accessToken);
is.close();
} catch (Exception e) {
e.printStackTrace();
}
return accessToken;
}
}
调用微信扫一扫处
public void gosao(){
ScanCodeController scan =new ScanCodeController();
//此处的地址,在哪里调用微信扫一扫 如果调用地方是页面(http://www.域名.com/页面名称/),如果是方法如下,一句话浏览器地址栏显示的是什么就写什么。
Map<String, String> map = scan.sign("http://www.*******.com/*****/front/express/goPay?val="+val);
String timestamp = map.get("timestamp");
String signature = map.get("signature");
String nonceStr = map.get("nonceStr");
setAttr("scantimestamp", timestamp);
setAttr("scansignature", signature);
setAttr("scannonceStr", nonceStr); //request.setAttribute(name, value);
render("/front/pay.html");//返回页面。页面可用AJAX请求。这是我的项目返回页面方法。
}
网页页面调用处
//此处进页面就被加载,不需要放在方法内
wx.config({
debug : false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId : '**************', // 必填,公众号的唯一标识
timestamp : '${scantimestamp}', // 必填,生成签名的时间戳
nonceStr : '${scannonceStr}', // 必填,生成签名的随机串
signature : '${scansignature}',// 必填,签名,见附录1
jsApiList : ['scanQRCode']// 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
生成上面所需数据:
//此处可用一个点击是件包含微信扫一扫,当点击某个按钮或者其他。进入此方法,调用微信扫一扫
document.querySelector('#scan').onclick = function (){
wx.scanQRCode({
needResult : 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果
desc : 'scanQRCode desc',
scanType: ["qrCode","barCode"],
success : function(res) {
//扫码后获取结果参数赋值给Input
var url = res.resultStr;
//商品条形码,扫描后返回的值,截取,号后面
if(url.indexOf(",")>=0){
var tempArray = url.split(',');
var tempNum = tempArray[1];
$("#phonesao").val(tempNum); //将值赋值给id为phonesao的input标签
}else{
$("#phonesao").val(url); //上面判断不成立,直接将URL赋值给id为phonesao的input标签
}
},
error: function(){
alert("调取失败");
}
});
}
页面调用处结束
这些方法,前面两个基本都可以算一个工具类。你在哪里调用,只需要调用方法,传一个URL值就可以完成扫一扫。这个URL,必须是浏览器地址是什么你就是什么。有参数,你也要有参数。上面有。下面在说一说配微信公众平台
微信公众平台配置
1.登陆微信公众平台,点击基本配置就有
2.如果调用扫一扫,唯一的配置
点击红色位置的名称;
设置你的安全域名,只需要:例:www.baidu.com 这里只需要输入baidu.com。OK
下一篇说微信支付。