這還真是第一次寫java程序。其實(shí),一直是對(duì)java有偏見的。無奈,從BlackFeather那里知道了微信數(shù)據(jù)庫(kù)加密方法,以及密碼的獲取方式。
公司主營(yíng)業(yè)務(wù):成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)公司推出井陘免費(fèi)做網(wǎng)站回饋大家。
發(fā)現(xiàn)是基于hashmap的,本來吧,還是想用C或者其他語言來實(shí)現(xiàn)對(duì)hashmap的讀取,可后來都失敗了。要么就是太復(fù)雜了。于是,還是硬著頭皮去把jdk裝好,然后~~~開始各種百度。
先用反編譯出來的代碼搭了個(gè)大體的輪廓。然后,自己各種加代碼(考慮到一些問題,還是只貼出一些關(guān)鍵代碼吧):
加密方式是:hash(imeiuin).substring(0,7)
public static void main(String[] args)
{
try
{
ObjectInputStream in = new ObjectInputStream(new FileInputStream(args[0]));
Object DL = in.readObject();
HashMap hashWithOutFormat = (HashMap)DL;
ObjectInputStream in1 = new ObjectInputStream(new FileInputStream(args[1]));
Object DJ = in1.readObject();
HashMap hashWithOutFormat1 = (HashMap)DJ;
String s = String.valueOf(hashWithOutFormat1.get(Integer.valueOf(258))); //取IMEI
s=s+hashWithOutFormat.get(Integer.valueOf(1));//
s=encode(s);//hash
System.out.println("The Key is : "+s.substring(0,7));
in.close();
in1.close();
}
}
具體方法步驟:
一、準(zhǔn)備階段:已認(rèn)證微信號(hào),且通過微信支付認(rèn)證,這個(gè)可以看微信文檔,很詳細(xì),這里就不再重復(fù)。
二、配置授權(quán)目錄,官方推薦使用https類型的url,不知道http能不能行,個(gè)人也推薦使用https的保證不會(huì)錯(cuò)。
配置授權(quán)域名
三、微信支付二次開發(fā)所需要的參數(shù):
APP_ID,APP_KEY,PARTNER,PARTNER_KEY(AppSecret)
APP_ID和PARTNER_KEY(AppSecret)
PARTNER
APP_KEY(自行設(shè)置32位字符)
四、具體編程
1、通過頁(yè)面跳轉(zhuǎn)到確認(rèn)支付頁(yè)面,其中的redirect_uri必須是配置授權(quán)目錄下的。
2、獲取到openid,再經(jīng)服務(wù)器向微信請(qǐng)求獲取prepay_id,封裝字段并進(jìn)行簽名后通過jsapi調(diào)起微信支付
3、測(cè)試結(jié)果
請(qǐng)閱讀消息接口使用指南,檢查你的接口配置URL+TOKEN或代碼是否出錯(cuò)或者服務(wù)器端口是否為80端口或服務(wù)器是否支持微信公眾平臺(tái)驗(yàn)證(這個(gè)你可以咨詢你的服務(wù)器商)。
1.首先我們新建一個(gè)Java開發(fā)包WeiXinSDK
2.包路徑:com.ansitech.weixin.sdk
測(cè)試的前提條件:
假如我的公眾賬號(hào)微信號(hào)為:vzhanqun
我的服務(wù)器地址為:
下面我們需要新建一個(gè)URL的請(qǐng)求地址
我們新建一個(gè)Servlet來驗(yàn)證URL的真實(shí)性,具體接口參考
接入指南
3.新建com.ansitech.weixin.sdk.WeixinUrlFilter.java
這里我們主要是獲取微信服務(wù)器法師的驗(yàn)證信息,具體驗(yàn)證代碼如下
[java] view plain copy print?
package com.ansitech.weixin.sdk;
import com.ansitech.weixin.sdk.util.SHA1;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class WeixinUrlFilter implements Filter {
//這個(gè)Token是給微信開發(fā)者接入時(shí)填的
//可以是任意英文字母或數(shù)字,長(zhǎng)度為3-32字符
private static String Token = "vzhanqun1234567890";
@Override
public void init(FilterConfig config) throws ServletException {
System.out.println("WeixinUrlFilter啟動(dòng)成功!");
}
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
//微信服務(wù)器將發(fā)送GET請(qǐng)求到填寫的URL上,這里需要判定是否為GET請(qǐng)求
boolean isGet = request.getMethod().toLowerCase().equals("get");
System.out.println("獲得微信請(qǐng)求:" + request.getMethod() + " 方式");
if (isGet) {
//驗(yàn)證URL真實(shí)性
String signature = request.getParameter("signature");// 微信加密簽名
String timestamp = request.getParameter("timestamp");// 時(shí)間戳
String nonce = request.getParameter("nonce");// 隨機(jī)數(shù)
String echostr = request.getParameter("echostr");//隨機(jī)字符串
ListString params = new ArrayListString();
params.add(Token);
params.add(timestamp);
params.add(nonce);
//1. 將token、timestamp、nonce三個(gè)參數(shù)進(jìn)行字典序排序
Collections.sort(params, new ComparatorString() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
//2. 將三個(gè)參數(shù)字符串拼接成一個(gè)字符串進(jìn)行sha1加密
String temp = SHA1.encode(params.get(0) + params.get(1) + params.get(2));
if (temp.equals(signature)) {
response.getWriter().write(echostr);
}
} else {
//處理接收消息
}
}
@Override
public void destroy() {
}
}
好了,不過這里有個(gè)SHA1算法,我這里也把SHA1算法的源碼給貼出來吧!
4.新建com.ansitech.weixin.sdk.util.SHA1.java
[java] view plain copy print?
/*
* 微信公眾平臺(tái)(JAVA) SDK
*
* Copyright (c) 2014, Ansitech Network Technology Co.,Ltd All rights reserved.
*
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.ansitech.weixin.sdk.util;
import java.security.MessageDigest;
/**
* pTitle: SHA1算法/p
*
* @author qsyangyangqisheng274@163.com
*/
public final class SHA1 {
private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
/**
* Takes the raw bytes from the digest and formats them correct.
*
* @param bytes the raw bytes from the digest.
* @return the formatted bytes.
*/
private static String getFormattedText(byte[] bytes) {
int len = bytes.length;
StringBuilder buf = new StringBuilder(len * 2);
// 把密文轉(zhuǎn)換成十六進(jìn)制的字符串形式
for (int j = 0; j len; j++) {
buf.append(HEX_DIGITS[(bytes[j] 4) 0x0f]);
buf.append(HEX_DIGITS[bytes[j] 0x0f]);
}
return buf.toString();
}
public static String encode(String str) {
if (str == null) {
return null;
}
try {
MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
messageDigest.update(str.getBytes());
return getFormattedText(messageDigest.digest());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
5.把這個(gè)Servlet配置到web.xml中
[html] view plain copy print?
filter
description微信消息接入接口/description
filter-nameWeixinUrlFilter/filter-name
filter-classcom.ansitech.weixin.sdk.WeixinUrlFilter/filter-class
/filter
filter-mapping
filter-nameWeixinUrlFilter/filter-name
url-pattern/api/vzhanqun/url-pattern
/filter-mapping
好了,接入的開發(fā)代碼已經(jīng)完成。
6.下面就把地址URL和密鑰Token填入到微信申請(qǐng)成為開發(fā)者模式中吧。
第一步:用戶同意授權(quán),獲取code 引導(dǎo)用戶進(jìn)入授權(quán)的URL 修改一些參數(shù)
在確保微信公眾賬號(hào)擁有授權(quán)作用域(scope參數(shù))的權(quán)限的前提下(服務(wù)號(hào)獲得高級(jí)接口后,默認(rèn)帶有scope參數(shù)中的snsapi_base和snsapi_userinfo),引導(dǎo)關(guān)注者打開如下頁(yè)面:
第二步:通過code換取網(wǎng)頁(yè)授權(quán)access_token? 這里的access_token與基礎(chǔ)獲取的access_token不同
具體做法與上面基本一致。更換相對(duì)應(yīng)的值。需要注意的是code可以寫一個(gè)Servlet獲取。String code = request.getParameter("code");get/post都可以。
這樣子就會(huì)返回一下json格式數(shù)據(jù)
具體代碼如下。獲取的code換取的access_token
根據(jù)上面代碼獲取的access_token? openid 然后再請(qǐng)求獲取userinfo的接口。就能得到微信用戶的所有信息了。
具體返回如下。獲取用戶信息代碼不再寫。
這就獲取到用戶的openid。應(yīng)用授權(quán)作用域,snsapi_base (不彈出授權(quán)頁(yè)面,直接跳轉(zhuǎn),只能獲取用戶openid),snsapi_userinfo (彈出授權(quán)頁(yè)面,可通過openid拿到昵稱、性別、所在地。并且,即使在未關(guān)注的情況下,只要用戶授權(quán),也能獲取其信息)我自己用的作用域?yàn)閟nsapi_userinfo。用戶點(diǎn)擊跳轉(zhuǎn)頁(yè)面為