蘇州培訓(xùn)網(wǎng) > 蘇州JAVA培訓(xùn)機(jī)構(gòu) > 蘇州其然軟件開發(fā)培訓(xùn)
首頁 培訓(xùn)網(wǎng) 最新資訊 熱門問答

蘇州其然軟件開發(fā)培訓(xùn)

13013833891 免費(fèi)試聽

您當(dāng)前的位置: 蘇州IT認(rèn)證培訓(xùn) > 蘇州JAVA培訓(xùn) > 太倉java培訓(xùn)班多少錢

太倉java培訓(xùn)班多少錢_JAVA培訓(xùn)

¥詳詢

班制:周末班

蘇州其然軟件開發(fā)
上課(咨詢)地址:蘇州市昆山市震川西路111號(hào)名仕大廈
報(bào)名咨詢 預(yù)約試聽
課程介紹
太倉java培訓(xùn)班多少錢
其然IT 教育師資

太倉java培訓(xùn)班多少錢

太倉java培訓(xùn)班多少錢

Java開發(fā)的應(yīng)該 如何掌握上述相關(guān)技術(shù)?

太倉java培訓(xùn)班多少錢

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

java工程師課程


太倉java培訓(xùn)班多少錢

課程大綱

一階段 二階段 三階段
  • 語言基礎(chǔ)、Java基礎(chǔ)

  • Java多線程

  • Java網(wǎng)絡(luò)編程

  • 程序調(diào)試/單元測(cè)試

  • XML

  • 數(shù)據(jù)庫

  • 數(shù)據(jù)結(jié)構(gòu)與算法

  • Html/Css/Javascript

  • Html5開發(fā)

  • CSS3

  • CSS命名規(guī)范、優(yōu)化 、使用技巧

  • JSP、Servlet、Ajax 、數(shù)據(jù)庫緩沖池、Tomcat

  • 項(xiàng)目開發(fā)流程及管理 、CMMI

  • 云計(jì)算

  • 大數(shù)據(jù)

  • 設(shè)計(jì)模式

  • MyBatis

  • Redis

  • Spring

  • SpringBoot

  • JMS

  • SpringCloud

  • Docker

  • Java前沿技術(shù) 常用 企業(yè)解決方案

  • UML/OOD/OOP

微信公眾號(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

課程熱線:

13013833891
在線咨詢

客服在線時(shí)間:早上9點(diǎn)~下午6點(diǎn),其他時(shí)間請(qǐng)?jiān)诰€預(yù)約報(bào)名或留言,謝謝!

蘇州JAVA

免費(fèi)體驗(yàn)課開班倒計(jì)時(shí)

11: 41: 09

稍后會(huì)有專業(yè)老師給您回電,請(qǐng)保持電話暢通

咨詢電話:13013833891
推薦機(jī)構(gòu) 全國分站 更多課程

本周僅剩 個(gè)試聽名額

請(qǐng)鍵入信息,稍后系統(tǒng)將會(huì)把領(lǐng)獎(jiǎng)短信發(fā)至您的手機(jī)

申請(qǐng)?jiān)嚶犆~

QQ:1413838287
加盟合作:0755-83654572