Java開發(fā)的應(yīng)該
如何掌握上述相關(guān)技術(shù)?
Java開發(fā)的應(yīng)該如何掌握上述相關(guān)技術(shù)?
一:首先,有這樣的一種情況很常見,對(duì)于想自學(xué)Java開發(fā)的人來說,他們
大多數(shù)都是非常盲目的,不知道自己改如何入手,很多人在網(wǎng)上找一些視頻,然后瘋狂的過視頻,很快就把一塊內(nèi)容都學(xué)完,他們理解的學(xué)完了就是視
頻看完了,但是讓他們動(dòng)手去做東西卻做不出來,而我的理解學(xué)完了就是自己能寫出東西,所以對(duì)于初學(xué)者來說一定不能盲目,要有自己的規(guī)劃,不然
就是浪費(fèi)時(shí)間白忙活。
二:既然是學(xué)習(xí)Java開發(fā)專業(yè)技術(shù),我個(gè)人的建議是,一定要有一個(gè)能指導(dǎo)
你的人,不能都靠自己閉門造車,這樣的行為并不聰明,結(jié)識(shí)一位這方面的人才,時(shí)不時(shí)去問問人家問題,不然你可能會(huì)發(fā)現(xiàn)一個(gè)小問題能困擾你一天
,**后還不知道是什么原因。
三:學(xué)習(xí)Java開發(fā)技術(shù),不能跟學(xué)數(shù)學(xué)語文一樣對(duì)待,比較剛接觸代碼是不
容易記住的,所以要掌握上述的技術(shù),你還要知道學(xué)習(xí)Java開發(fā)技術(shù)有哪些“坑”。對(duì)于學(xué)習(xí)方法這塊是尤為重要的,怎么學(xué)才能讓你學(xué)完了能記住之
前學(xué)的那些,不至于學(xué)完了就忘,這個(gè)問題值得你學(xué)習(xí)之前去思考的。
四:根據(jù)我多年的學(xué)習(xí)情況來看,你平時(shí)一定要養(yǎng)成好的學(xué)習(xí)習(xí)慣,就說我
自己吧!我就喜歡把自己曾經(jīng)遇到的問題整理在電腦的日記本上,然后我會(huì)搜集一下博客相關(guān)的Java技術(shù)文章,一些我認(rèn)為比較有用的網(wǎng)站,以后都能
用的上,這是我個(gè)人的學(xué)習(xí)習(xí)慣,相信我,如果你想走的更遠(yuǎn),一定要養(yǎng)成習(xí)慣。
**后給大家一些詳細(xì)的學(xué)習(xí)安排路線:
Java基礎(chǔ):Java基礎(chǔ)語法、數(shù)組、類與對(duì)象、繼承與多態(tài)、異常、范型、集
合、流與文件、反射、枚舉、自動(dòng)裝箱和注解。
數(shù)據(jù)庫:mysql、oracle
Javaweb:HTML與CSS網(wǎng)頁開發(fā)基礎(chǔ)、Java腳本語言、搭建開發(fā)環(huán)境、JSP基
本語法、JSP內(nèi)置對(duì)象、JavaBean技術(shù)、Servlet技術(shù)、Ajax技術(shù)
框架:Struts2、Hibernate、Spring、SpringMVC、mybatis
課程大綱
一階段
|
二階段
|
三階段
|
|
-
Html/Css/Javascript
-
Html5開發(fā)
-
CSS3
-
CSS命名規(guī)范、優(yōu)化
、使用技巧
-
JSP、Servlet、Ajax
、數(shù)據(jù)庫緩沖池、Tomcat
-
項(xiàng)目開發(fā)流程及管理
、CMMI
-
云計(jì)算
-
大數(shù)據(jù)
|
|
微信公眾號(hào)開發(fā)和微信支付
>
博客這么久沒寫了(因?yàn)榕笥?^__^) 嘻嘻……),今天決定把微信相關(guān)開發(fā)遇到的坑給大家分享一下,以免大家掉入坑浪費(fèi)過多的時(shí)間!
我會(huì)在文章末尾上傳一個(gè)開箱即用的微信公眾號(hào)支付的demo,理論上來講你只需要修改配置文件就可以支付了。
使用的技術(shù):SPRingBoot、angularJs。
使用了一個(gè)第三方的微信mavne依賴: weixin-java-mp在pom可以看見,時(shí)過境遷可能weixin-java-mp版本更新了。weixin-java-mp的API:https://github.com/chanjarster/weixin-java-tools/wiki
mavne依賴在中央倉庫可以查找:http://mvnrepository.com/
微信公眾號(hào)配置
access.properties文件
該文件中主要配置公眾號(hào)和微信支付相關(guān)參數(shù),里面的信息在申請(qǐng)公眾號(hào)和申請(qǐng)微信支付就會(huì)得到(開箱即用也就是修改這個(gè)配置文件里面的內(nèi)容)
該工具類主要映射access.properties文件鍵的名稱
讀取access.properties文件的方式為: String appId=PropertyHandler.getInstance().getValue(SampleConstants.WEIXIN_APPID)
初始化配置公眾號(hào)
/**
* 初始化微信配置
*/
public class WeiXinInitConfigUtil {
public static WxMpInMemoryConfigStorage wxMpConfigStorage;
public static WxMpService wxMpService;
public static WxMpMessageRouter wxMpMessageRouter;
public static WxMpOAuth2AccessToken wxMpOAuth2AccessToken;
//注意靜態(tài)塊,這里使用的是weixin-java-mp的API,直接對(duì)應(yīng)配置文件填上去。
static {
WxMpInMemoryConfigStorage storage=new WxMpInMemoryConfigStorage();
storage.setAppId(PropertyHandler.getInstance().getValue(SampleConstants.WEIXIN_CORPID)); storage.setSecret(PropertyHandler.getInstance().getValue(SampleConstants.WEIXIN_CORPSECRET));
storage.setToken(PropertyHandler.getInstance().getValue(SampleConstants.WEIXIN_APP_APPID_TOKEN));
storage.setAesKey(PropertyHandler.getInstance().getValue(SampleConstants.WEIXIN_APP_APPID_AESKEY));
wxMpConfigStorage=storage;
wxMpService = new WxMpServiceImpl();
wxMpService.setWxMpConfigStorage(storage);
wxMpMessageRouter = new WxMpMessageRouter(wxMpService);
}
}
封裝當(dāng)前用戶
用攔截器來配置需要的校驗(yàn)參數(shù) 。
/**
* Created by orange on 2016/10/27.
* 獲取微信用戶相關(guān)信息的攔截器,該攔截器將會(huì)過濾所有請(qǐng)求,進(jìn)行是否包含 微信登錄用戶的判斷。
*/
@Component
public class WxCpIntercepter implements HandlerInterceptor {
private static final long serialVersionUID = 1L;
private static final Logger logger = LoggerFactory.getLogger(WxCpIntercepter.class);
//在請(qǐng)求處理之前進(jìn)行調(diào)用(Controller方法調(diào)用之前)
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
String userAgent = request.getHeader("user-agent");
//獲取session里面的用戶對(duì)象
WxMpUser wxUser = (WxMpUser) request.getSession().getAttribute(SampleConstants.WEIXIN_USER);
//獲取request中的code
String code = request.getParameter("code");
//當(dāng)request請(qǐng)求里面有code,但是session里面沒有weixinUser(登錄微信用戶),將會(huì)查詢的微信用戶封裝到session中
if (code != null && wxUser == null) {
WxCpUtil.setUserIdForSession(request);
}
//設(shè)置微信校驗(yàn)參數(shù)到session中
WxCpUtil.openContact(request);
return true;// 只有返回true才會(huì)繼續(xù)向下執(zhí)行,返回false取消當(dāng)前請(qǐng)求
}
//請(qǐng)求處理之后進(jìn)行調(diào)用,但是在視圖被渲染之前(Controller方法調(diào)用之后)
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
//在整個(gè)請(qǐng)求結(jié)束之后被調(diào)用,也就是在DispatcherServlet 渲染了對(duì)應(yīng)的視圖之后執(zhí)行(主要是用于進(jìn)行資源清理工作)
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
對(duì)攔截器進(jìn)行統(tǒng)一配置
/**
* Created by orange on 2016/10/27.
* 攔截器集中配置類
*/
@Configuration
public class FilterConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 多個(gè)攔截器組成一個(gè)攔截器鏈
// addPathPatterns 用于添加攔截規(guī)則
// excludePathPatterns 用戶排除攔截
//這里可添加多個(gè)攔截器
registry.addInterceptor(new WxCpIntercepter()).addPathPatterns("/**");
super.addInterceptors(registry);
}
}
攔截器使用的WxCpUtil類代碼
public class WxCpUtil {
private static final Logger logger = LoggerFactory.getLogger(WxCpUtil.class);
/**
* 判斷用戶是否關(guān)注了公眾號(hào)
* @param token
* @param openid
* @return
*/
public static boolean judgeIsFollow(String token,String openid){
int zhi=0;
InputStream is=null;
String url = "https://api.weixin.QQ.com/cgi-bin/user/info?access_token=" token "&openid=" openid "&lang=zh_CN";
try {
URL urlGet = new URL(url);
HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();
http.setRequestMethod("GET"); // 必須是get方式請(qǐng)求
http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
http.setDoOutput(true);
http.setDoInput(true);
http.connect();
is = http.getInputStream();
int size = is.available();
byte[] jsonBytes = new byte[size];
is.read(jsonBytes);
String message = new String(jsonBytes, "UTF-8");
//序列化json字符串
Gson gson = WxMpGsonBuilder.INSTANCE.create();
JsonObject jsonObject = (JsonObject)gson.fromJson(message, JsonObject.class);
//用戶是否訂閱該公眾號(hào)標(biāo)識(shí),值為0時(shí),代表此用戶沒有關(guān)注該公眾號(hào),1的時(shí)候表示關(guān)注了。
zhi = jsonObject.get("subscribe").getAsInt();
} catch (Exception e) {
e.printStackTrace();
}finally {
if(is!=null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return 1==zhi;
}
//獲取設(shè)置微信用戶
public static void setUserIdForSession(HttpServletRequest request) throws UnsupportedEncodingException {
//**code獲取微信用戶信息
String code = request.getParameter("code");
String state = request.getParameter("state");
logger.debug("code={}", code);
logger.debug("state={}", state);
String[] res = null;
try {
wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(code);
WxMpUser wxMpUser = wxMpService.oauth2getUserInfo(wxMpOAuth2AccessToken, null);
String token = wxMpService.getAccessToken();
//判斷用戶是否關(guān)注
boolean flag = judgeIsFollow(token, wxMpUser.getOpenId());
if(!flag){//用戶沒有關(guān)注
//公眾號(hào)讓他關(guān)注
}
request.getSession().setAttribute(SampleConstants.WEIXIN_USER, wxMpUser);
} catch (WxErrorException e) {
e.printStackTrace();
}
}
//設(shè)置微信校驗(yàn)參數(shù)
public static void openContact(HttpServletRequest request) {
try {
String ip = request.getRemoteAddr();
logger.debug("ip地址={}",ip);
String urlStr = WxCpUtil.getFullURL(request);
logger.debug("request.getRequestURI() = {}", urlStr);
if (urlStr.indexOf("goto") > -1 || urlStr.indexOf("menu") > -1) {
WxJsapiSignature signature = wxMpService.createJsapiSignature(urlStr);
request.getSession().setAttribute("signature", signature);
}
} catch (WxErrorException e) {
e.printStackTrace();
try {
throw new ServletException();
} catch (ServletException e1) {
e1.printStackTrace();
}
}
}
public static String getFullURL(HttpServletRequest request) {
String SeverNameForURI = PropertyHandler.getInstance().getValue("SeverNameForURI");
String uri = request.getScheme() "://"
SeverNameForURI
request.getRequestURI()
(request.getQueryString() != null ? "?" request.getQueryString() : "");
return uri;
}
public static WxJsGroupSignature createGroupapiSignature(String url) throws WxErrorException {
String accerssToken=wxMpService.getAccessToken();
String zhi = wxMpService.getJsapiTicket();
JsonElement tmpJsonElement = (new JsonParser()).parse(zhi);
JsonObject tmpJsonObject = tmpJsonElement.getAsJsonObject();
String jsapiGroupErrcode = tmpJsonObject.get("errcode").getAsString();
String jsapiGroupId = tmpJsonObject.get("group_id").getAsString();
String jsapiGroupTicket = tmpJsonObject.get("ticket").getAsString();
long timestamp = System.currentTimeMillis() / 1000L;
String noncestr = RandomUtils.getRandomStr();
String signature = SHA1.genWithAmple(new String[]{"group_ticket=" jsapiGroupTicket, "noncestr=" noncestr, "timestamp=" timestamp, "url=" url});
WxJsGroupSignature jsGroupapiSignature = new WxJsGroupSignature();
jsGroupapiSignature.setTimestamp(timestamp);
jsGroupapiSignature.setNonceStr(noncestr);
jsGroupapiSignature.setUrl(url);
jsGroupapiSignature.setSignature(signature);
jsGroupapiSignature.setGroupId(jsapiGroupId);
jsGroupapiSignature.setGroupErrcode(jsapiGroupErrcode);
jsGroupapiSignature.setGroupTicket(jsapiGroupTicket);
jsGroupapiSignature.setAccessToken(accerssToken);
logger.debug("jsapiGroupErrcode=[{}],jsapiGroupId=[{}],jsapiGroupTicket=[{}],jsapiGroupSignature=[{}]", jsapiGroupErrcode, jsapiGroupId, jsapiGroupTicket, jsGroupapiSignature.getSignature());
return jsGroupapiSignature;
}
}
至此我們已經(jīng)把公眾號(hào)需要的配置全部封裝到session里面去了,接下來我們只需要用Ajax向后臺(tái)發(fā)起請(qǐng)求獲取配置就好了。
微信支付配置
**步和第二步
微信支付平臺(tái)地址:https://pay.weixin.qq.com/
微信公眾平臺(tái)地址:https://mp.weixin.qq.com/
**步在微信支付平臺(tái)設(shè)置key:安全中心—->API安全
第二步在微信公眾平臺(tái)設(shè)置測(cè)試授權(quán)目錄和測(cè)試白名單:微信支付—->開發(fā)配置(注意:授權(quán)目錄一定要精確到調(diào)用html頁面**后一級(jí),比如你的支付頁面url為:www.orange.com/pay/test/pay.html那么你的授權(quán)目錄為:www.orange.com/pay/test/)
第三步
獲取統(tǒng)一下單號(hào)和微信JSAPI需要參數(shù)。
統(tǒng)一下單號(hào)的說白了就是微信返回給你的訂單號(hào),JSAPI是需要這個(gè)訂單號(hào)再次進(jìn)行訪問微信服務(wù)器的,微信服務(wù)器就根據(jù)這個(gè)訂單號(hào)獲取統(tǒng)一下單的詳細(xì)信息包括,(多少錢,買了什么東西,等等….),然后調(diào)用微信的支付客戶輸入密碼付錢。
這里有兩點(diǎn)需要我們注意。
微信加密校驗(yàn)地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=20_1
1、微信的加密方式:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3
2、微信統(tǒng)一下單需要的參數(shù):https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
具體代碼
@Controller
public class GetUnifiedOrderController {
/**
* @return 微信支付參數(shù)
*/
@ResponseBody
@RequestMapping("/GetUnifiedOrderController")
public WXPayBean GetUnifiedOrderController(HttpServletRequest request){
//生成訂單xml String orderInfo=createOrderInfo(request);
//調(diào)用統(tǒng)一下單API,獲取訂單號(hào)
String prepay_id = httpOrder(orderInfo);
//生成**后支付的對(duì)象
WXPayBean wxpayBean = startPay(prepay_id);
return wxpayBean;
}
/**
* 生成訂單XML
* @return
*/
private String createOrderInfo(HttpServletRequest request) {
String appId = PropertyHandler.getInstance().getValue(SampleConstants.WEIXIN_APPID);
String mchId = PropertyHandler.getInstance().getValue(SampleConstants.WEIXIN_MCHID);
String key = PropertyHandler.getInstance().getValue(SampleConstants.WEIXIN_KEY);
// orderId 商戶訂單號(hào)商戶支付的訂單號(hào)由商戶自定義生成,微信支付要求商戶訂單號(hào)保持唯一性(建議根據(jù)當(dāng)前系統(tǒng)時(shí)間加隨機(jī)序列來生成訂單號(hào))。
// 重新發(fā)起一筆支付要使用原訂單號(hào),避免重復(fù)支付;已支付過或已調(diào)用關(guān)單、撤銷(請(qǐng)見后文的API列表)的訂單號(hào)不能重新發(fā)起支付。
String orderId=wxPayUtils.makeUUID();
//獲取當(dāng)前用戶的openid
WxMpUser wxUser = (WxMpUser) request.getSession().getAttribute(SampleConstants.WEIXIN_USER);
String openid = wxUser.getOpenId();
//隨機(jī)字符串
String uuid = wxPayUtils.makeUUID();
//根據(jù)規(guī)則創(chuàng)建可排序的map集合
SortedMap<String, Object> packageParams = new TreeMap<String, Object>();
packageParams.put("appid", appId);//公眾賬號(hào)ID
packageParams.put("mch_id",mchId);//商戶號(hào)
packageParams.put("nonce_str",uuid);//隨機(jī)字符串
packageParams.put("body","我是商品描述");//商品描述 注意加上<![CDATA[ ]]>保證解析器忽略解析里面的內(nèi)容
packageParams.put("out_trade_no", orderId);//商戶訂單號(hào)
packageParams.put("total_fee",1);//金額需要擴(kuò)大100倍:1代表支付的是0.01元
packageParams.put("spbill_create_ip","171.221.149.199");//用戶IP地址
packageParams.put("notify_url", "1598m20l41.51mypc.cn/gotoMap/scanCoedOk");//通知地址
packageParams.put("trade_type", "JSAPI");//JSAPI--公眾號(hào)支付、NATIVE--原生掃碼支付、APP--app支付
packageParams.put("openid",openid);//前用戶的openid
//獲取簽名(使用工具類里面的加密方法,大家可以直接將工具類拷貝到自己的項(xiàng)目中使用)
String sign = wxPayUtils.md5Str(packageParams,key);
//拼接成一個(gè)xml。
String xml="<xml>"
"<appid>" appId "</appid>"
"<mch_id>" mchId "</mch_id>"
"<nonce_str>" uuid "</nonce_str>"
"<sign>" sign "</sign>"
"<body><![CDATA[" "我是商品描述" "]]></body>"
"<out_trade_no>" orderId "</out_trade_no>"
"<total_fee>" 1 "</total_fee>"
"<spbill_create_ip>" "171.221.149.199" "</spbill_create_ip>"
"<notify_url>" "1598m20l41.51mypc.cn/gotoMap/scanCoedOk" "</notify_url>"
"<trade_type>" "JSAPI" "</trade_type>"
"<openid>" openid "</openid>"
"</xml>";
return xml;
}
/**
* 調(diào)用統(tǒng)一下單API
* @param orderInfo
* @return
*/
private String httpOrder(String orderInfo) {
String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
try {
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
//加入數(shù)據(jù)
conn.setRequestMethod("POST");
conn.setDoOutput(true);
BufferedOutputStream buffOutStr = new BufferedOutputStream(conn.getOutputStream());
buffOutStr.write(orderInfo.getBytes());
buffOutStr.flush();
buffOutStr.close();
//獲取輸入流
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = null;
StringBuffer sb = new StringBuffer();
while((line = reader.readLine())!= null){
sb.append(line);
}
//解析xml
SAXReader reader1 = new SAXReader();
reader1.setEncoding("utf-8");
Document document;
document = reader1.read(new ByteArrayInputStream(sb.toString().getBytes("UTF-8")));
Element element = document.getRootElement();//得到xml跟標(biāo)簽,此處是<root></root>
Element prepay_idElement = element.element("prepay_id");
String prepay_id = prepay_idElement.getData() "";
Element return_codeElement = element.element("return_code");
String return_code = return_codeElement.getData() "";
Element result_codeElement = element.element("result_code");
String result_code = result_codeElement.getData() "";
if("SUCCESS".equals(return_code)&&"SUCCESS".equals(result_code)){
//當(dāng)都為SUCCESS的時(shí)候才將統(tǒng)一下單id返回出去
return prepay_id;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 設(shè)置微信支付**后一步所需要的參數(shù)
* @param prepay_id 統(tǒng)一支付id
* @return 支付對(duì)象
*/
private WXPayBean startPay(String prepay_id){
String appId = PropertyHandler.getInstance().getValue(SampleConstants.WEIXIN_APPID);
String key = PropertyHandler.getInstance().getValue(SampleConstants.WEIXIN_KEY);
WXPayBean wxPayBean=new WXPayBean();
String timeStamp = String.valueOf((System.currentTimeMillis() / 1000));//1970年到現(xiàn)在的秒數(shù)
String nonceStr =wxPayUtils.makeUUID();//隨機(jī)字符串
String signType = "MD5";
SortedMap<String, Object> packageParams = new TreeMap<String, Object>();
packageParams.put("appId",appId);//注意這里的appId中的I是大寫的喔不要弄錯(cuò)了。
packageParams.put("timeStamp",timeStamp);
packageParams.put("nonceStr",nonceStr);
packageParams.put("signType",signType);
packageParams.put("package","prepay_id=" prepay_id);
//獲取簽名(用同樣的方式加密)
String paySign = wxPayUtils.md5Str(packageParams, key);
//封裝微信支付實(shí)例
wxPayBean.setTimeStamp(timeStamp);
wxPayBean.setNonceStr(nonceStr);
wxPayBean.setPackage_("prepay_id=" prepay_id);
wxPayBean.setSignType(signType);
wxPayBean.setPaySign(paySign);
return wxPayBean ;
}
}
至此我們已經(jīng)封裝完成微信支付需要的全部配置,等待JSAPI向我們請(qǐng)求數(shù)據(jù)就好了。
工具類wxPayUtils代碼
/**
* Created by orange on 2017/1/19.
* 微信支付工具類
*/
public class wxPayUtils {
/**
*
* @param params 需要簽名的參數(shù),鍵值對(duì)
* @param key (支付平臺(tái)的安全密鑰)key設(shè)置路徑:微信商戶平臺(tái)(pay.weixin.qq.com)-->賬戶設(shè)置-->API安全-->密鑰設(shè)置
* @return MD5加密后轉(zhuǎn)換為大寫返回
*/
public static String md5Str(SortedMap<String, Object>params,String key){
//**步 鍵按照字典序
StringBuffer sb = new StringBuffer();
Set es = params.entrySet();
Iterator it = es.iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
String k = entry.getKey() "";
String v = entry.getValue() "";
//為空不參與簽名、參數(shù)名區(qū)分大小寫
if (null != v && !"".equals(v) && !"sign".equals(k)
&& !"key".equals(k)) {
sb.append(k "=" v "&");
}
}
//第二步拼接key
sb.append("key=" key);
//MD5加密 轉(zhuǎn)換為大寫返回
String sign="";
try{
String zhi = new String(sb.toString().getBytes("UTF-8"));
sign=getMd5Str(zhi).toUpperCase();
}catch (UnsupportedEncodingException e){
e.printStackTrace();
}
return sign;
}
/**
* 時(shí)間戳和隨機(jī)數(shù)創(chuàng)建UUID
* @return
*/
public static synchronized String makeUUID() {
Date date = new Date();
String dateStr = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(date) "";
StringBuffer s = new StringBuffer(dateStr);
return s.append((new Random().nextInt(900) 100)).toString();
}
//MD5加密
public static String getMd5Str(String sourceStr){
String result = "";
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(sourceStr.getBytes());
byte b[] = md.digest();
int i;
StringBuffer buf = new StringBuffer("");
for (int offset = 0; offset < b.length; offset ) {
i = b[offset];
if (i < 0)
i = 256;
if (i < 16)
buf.append("0");
buf.append(Integer.toHexString(i));
}
result = buf.toString();
System.out.println("MD5(" sourceStr ",32) = " result);
System.out.println("MD5(" sourceStr ",16) = " buf.toString().substring(8, 24));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return result;
}
}
微信支付JS
微信SDK說明:https://mp.weixin.qq.com/wiki
<!DOCTYPE html>
<html lang="en">
<head>
<title>微信支付</title>
<meta charset="utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, minimum-scale=1.0"/>
<meta http-equiv="Access-Control-Allow-Origin" content="*"/>
<meta name="description" content="" />
<meta name="author" content="" />
<link href="/CSS/mycss.css" rel="stylesheet" />
<script src="http://cdn.bootcss.com/angular.js/1.5.7/angular.min.js"></script>
<script src="http://cdn.bootcss.com/angular.js/1.5.7/angular-animate.min.js"></script>
<script src="http://cdn.bootcss.com/angular.js/1.5.7/angular-resource.min.js"></script>
<script src="http://cdn.bootcss.com/angular.js/1.5.7/angular-route.min.js"></script>
<script src="http://cdn.bootcss.com/angular.js/1.5.7/angular-messages.min.js"></script>
<script src="http://cdn.bootcss.com/jquery/1.12.4/jquery.js"></script>
<script src="http://res.wx.qq.com/open/js/jweixin-1.1.0.js" type="text/Javascript"></script>
<script src="http://cdn.bootcss.com/zepto/1.1.6/zepto.min.js"></script>
<script src="/js/pay/pay.js"></script>
<script>
var myApp=angular.module("myApp",[]);
myApp.controller("myController",function ($scope,$location,$http) {
//獲取微信js配置簽名(后臺(tái)java類:ContacterController.java)
var url="/getContacter";
var parObj={}
//這里可以使用AJAX替換就是向后臺(tái)請(qǐng)求數(shù)據(jù)。(這是angular的寫法)
$http.get(url,{params:parObj}).success(function(wxParm) {
if(wxParm.success){
//設(shè)置微信支付的配置
getPay(wxParm);
}
});
//獲取微信支付配置參數(shù)
function getPay(wxParm) {
//(后臺(tái)java類:GetUnifiedOrderController.java)
var url="/GetUnifiedOrderController";
var parObj={}
//這里可以使用AJAX替換就是向后臺(tái)請(qǐng)求數(shù)據(jù)。(這是angular的寫法)
$http.get(url,{params:parObj}).success(function(payParm) {
console.log(payParm);
//調(diào)用pay.js的方法
wxconfigMap(wxParm,payParm);
});
}
});
</script>
</head>
<body ng-app="myApp" ng-controller="myController">
<h1>正在打開微信支付接口.....</h1>
</body>
</html>
pay.js代碼
/**
* Created by orange on 2016/11/16.
*/
var wxmap;//全局參數(shù)map包含微信初始化相關(guān)參數(shù)
var paymap; //微信支付的相關(guān)參數(shù)
//設(shè)置微信相關(guān)參數(shù)
function wxconfigMap(wxParm,payParm){
wxmap=wxParm;
paymap=payParm;
wx.config({
debug: false,
appId: wxxxxxxx ,
timestamp: wxmap.time,
nonceStr: wxmap.randomStr,
signature:wxmap.signature,
jsApiList: [
chooseWXPay
]
});
}
//微信接口設(shè)置完畢回調(diào)方法
wx.ready(function () {
wx.chooseWXPay({
timestamp: paymap.timeStamp, // 支付簽名時(shí)間戳,注意微信jssdk中的所有使用timestamp字段均為小寫。但**新版的支付后臺(tái)生成簽名使用的timeStamp字段名需大寫其中的S字符
nonceStr: paymap.nonceStr, // 支付簽名隨機(jī)串,不長(zhǎng)于 32 位
package: paymap.package_, // 統(tǒng)一支付接口返回的prepay_id參數(shù)值,提交格式如:prepay_id=***)
signType:paymap.signType, // 簽名方式,默認(rèn)為 SHA1 ,使用新版支付需傳入 MD5
paySign: paymap.paySign, // 支付簽名
success: function (res) {
// alert( 支付成功! );
// 支付成功后的回調(diào)函數(shù)
}
});
});
wx.error(function (res) {
alert(res.errMsg);
});
需要警惕地方
1、后臺(tái)在進(jìn)行加密的時(shí)候一定要注意大小寫,加密是32位的。
2、獲取統(tǒng)一下單Id的時(shí)候 注意body里面的內(nèi)容要使用[CDATA[]]包含起來。
3、注意測(cè)試授權(quán)目錄一定是**后一級(jí)。
4、微信wx.chooseWXPay({})方法里面的 timeStamp的值是秒數(shù),后臺(tái)要用毫秒數(shù)除以1000不要弄成毫秒數(shù)了。
5、代碼出了bug淡定點(diǎn)笑著面對(duì)千萬不要心急喔,加油?。。。?
6、demo**地址: https://pan.baidu.com/s/1i58z33B
相關(guān)推薦:
蘇州JAVA培訓(xùn) 蘇州JAVA培訓(xùn)班 蘇州JAVA培訓(xùn)機(jī)構(gòu)
體驗(yàn)課預(yù)約試聽
倒計(jì)時(shí)
12:00:00