日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php開源 > 綜合技術(shù) > [置頂] 微信:微信掃碼支付、調(diào)用統(tǒng)一下單接口、網(wǎng)站支付 + springmvc

[置頂] 微信:微信掃碼支付、調(diào)用統(tǒng)一下單接口、網(wǎng)站支付 + springmvc

來源:程序員人生   發(fā)布時間:2016-06-16 17:22:10 閱讀次數(shù):7228次

1、場景:公司需要在網(wǎng)站上進行微信支付。

2、API:使用微信開放平臺的接入微信支付.


-掃碼支付。微信支付開發(fā)者平臺鏈接

3、分析:

  1. 接入掃碼支付(包括PC網(wǎng)站支付)包括3個階段,問這里只講使用,也就是第2階段的《啟動設(shè)計和開發(fā)》。
  2. 點擊查看開發(fā)者文檔(掃碼支付)后,這里感覺微信的文檔沒有支付寶好理解(略微吐槽下~~~),不過我們疏忽1切,直接進入模式2:模式2最簡單直接,不需要在商戶后臺進行配置,推薦大家使用,微信也說流程更加簡單,我這里也講的是模式2,模式1大家有興趣可以自行研究下。
  3. 如上圖,總流程有14步,主要流程是生成定單、調(diào)統(tǒng)1下單API、將返回的支付交易鏈接生成2維碼展現(xiàn);我這邊主要就是將這3步結(jié)合springmvc后,成功生兒2維碼以后,用戶就能夠掃碼支付了。后面的回調(diào)跟跟我的另外一篇博文基本類似,大家鑒戒下就好了:支付寶:web頁面掃碼支付、網(wǎng)站支付、支付寶即時到賬 + springmvc

4、實現(xiàn):

  1. 準(zhǔn)備:根據(jù)統(tǒng)1下單接口API我先定義了3個對象:UnifiedOrderRequest(統(tǒng)1下單要求參數(shù)(必填))、UnifiedOrderRequestExt(統(tǒng)1下單要求參數(shù)(非必填))、UnifiedOrderRespose(統(tǒng)1下單返回參數(shù));具體以下代碼,get、set方法可自行生產(chǎn),太占篇幅。

    UnifiedOrderRequest.class
    /** * 統(tǒng)1下單要求參數(shù)(必填) * @author Y * */ public class UnifiedOrderRequest { private String appid; //公眾賬號ID private String mch_id; //商戶號 private String nonce_str; //隨機字符串 private String sign; //簽名 private String body; //商品描寫 private String out_trade_no; //商戶定單號 private String total_fee; //總金額 private String spbill_create_ip; //終端IP private String notify_url; //通知地址 private String trade_type; //交易類型 }
    UnifiedOrderRequestExt.class
    /** * 統(tǒng)1下單要求參數(shù)(非必填) * @author Y * */ public class UnifiedOrderRequestExt extends UnifiedOrderRequest{ private String device_info; //裝備號 private String detail; //商品詳情 private String attach; //附加數(shù)據(jù) private String fee_type; //貨幣類型 private String time_start; //交易起始時間 private String time_expire; //交易結(jié)束時間 private String goods_tag; //商品標(biāo)記 private String product_id; //商品ID private String limit_pay; //指定支付方式 private String openid; //用戶標(biāo)識 }
    UnifiedOrderRespose.class
    /** * 統(tǒng)1下單返回參數(shù) * @author Y * */ public class UnifiedOrderRespose { private String return_code; //返回狀態(tài)碼 private String return_msg; //返回信息 private String appid; //公眾賬號ID private String mch_id; //商戶號 private String device_info; //裝備號 private String nonce_str; //隨機字符串 private String sign; //簽名 private String result_code; //業(yè)務(wù)結(jié)果 private String err_code; //毛病代碼 private String err_code_des; //毛病代碼描寫 private String trade_type; //交易類型 private String prepay_id; //預(yù)支付交易會話標(biāo)識 private String code_url; //2維碼鏈接 }
  2. Controller主入口:
    /** * 創(chuàng)建2維碼 */ @RequestMapping("createQRCode") public void createQRCode(String orderId, HttpServletResponse response) { //生成定單 String orderInfo = createOrderInfo(orderId); //調(diào)統(tǒng)1下單API String code_url = httpOrder(orderInfo); //將返回預(yù)支付交易鏈接(code_url)生成2維碼圖片 //這里使用的是zxing 說明1(見文末) try { int width = 200; int height = 200; String format = "png"; Hashtable hints = new Hashtable(); hints.put(EncodeHintType.CHARACTER_SET, "utf⑻"); BitMatrix bitMatrix = new MultiFormatWriter().encode(code_url, BarcodeFormat.QR_CODE, width, height, hints); OutputStream out = null; out = response.getOutputStream(); MatrixToImageWriter.writeToStream(bitMatrix, format, out); out.flush(); out.close(); } catch (Exception e) { } }

  3. 生成定單:分兩部份:1部份是業(yè)務(wù)需求的定單信息,就是發(fā)起支付前的定單信息,業(yè)務(wù)系統(tǒng)自行創(chuàng)建存儲;另外一部份是滿足統(tǒng)1下單API要求的定單信息(也是我們這里要講的)。“xxxxxx”:是你需要自己填寫的對應(yīng)信息:
    /** * 生成定單 * @param orderId * @return */ private String createOrderInfo(String orderId) { //生成定單對象 UnifiedOrderRequest unifiedOrderRequest = new UnifiedOrderRequest(); unifiedOrderRequest.setAppid("xxxxxxxxxxxxx");//公眾賬號ID unifiedOrderRequest.setMch_id("xxxxxxxxx");//商戶號 unifiedOrderRequest.setNonce_str(StringUtil.makeUUID());//隨機字符串 說明2(見文末) unifiedOrderRequest.setBody("xxxxxx");//商品描寫 unifiedOrderRequest.setOut_trade_no(orderId);//商戶定單號 unifiedOrderRequest.setTotal_fee("x"); //金額需要擴大100倍:1代表支付時是0.01 unifiedOrderRequest.setSpbill_create_ip("xxxxxxxxxxxxx");//終端IP unifiedOrderRequest.setNotify_url("xxxxxxxxxxxxxx");//通知地址 unifiedOrderRequest.setTrade_type("NATIVE");//JSAPI--公眾號支付、NATIVE--原生掃碼支付、APP--app支付 unifiedOrderRequest.setSign(createSign(unifiedOrderRequest));//簽名說明5(見文末,簽名方法1并給出) //將定單對象轉(zhuǎn)為xml格式 XStream xStream = new XStream(new XppDriver(new XmlFriendlyNameCoder("_-", "_"))); //說明3(見文末) xStream.alias("xml", UnifiedOrderRequest.class);//根元素名需要是xml return xStream.toXML(unifiedOrderRequest); }

  4. 調(diào)統(tǒng)1下單API:根據(jù)要求將生成定單中返回的xml向微信給定的統(tǒng)1下單URL地址:https://api.mch.weixin.qq.com/pay/unifiedorder,發(fā)送要求,成功并取得2維碼。
    /** * 調(diào)統(tǒng)1下單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); } XStream xStream = new XStream(new XppDriver(new XmlFriendlyNameCoder("_-", "_")));//說明3(見文末) //將要求返回的內(nèi)容通過xStream轉(zhuǎn)換為UnifiedOrderRespose對象 xStream.alias("xml", UnifiedOrderRespose.class); UnifiedOrderRespose unifiedOrderRespose = (UnifiedOrderRespose) xStream.fromXML(sb.toString()); //根據(jù)微信文檔return_code 和result_code都為SUCCESS的時候才會返回code_url //說明4(見文末) if(null!=unifiedOrderRespose && "SUCCESS".equals(unifiedOrderRespose.getReturn_code()) && "SUCCESS".equals(unifiedOrderRespose.getResult_code())){ return unifiedOrderRespose.getCode_url(); }else{ return null; } } catch (Exception e) { e.printStackTrace(); } return null; }

  5. 將返回的支付交易鏈接生成2維碼展現(xiàn):沒有異常的情況下,在頁面中使用標(biāo)簽接收就行。實際使用時,結(jié)合前端和業(yè)務(wù)的需求放置2維碼。可以在掃碼支付/案例及規(guī)范中找到部份素材和界面規(guī)范來設(shè)計微信風(fēng)格的支付頁面。

  6. 用戶可以通過維系客戶端進行掃碼支付。支付完成后回調(diào)我們notify_url設(shè)置的url,通過成功的回調(diào)來更改業(yè)務(wù)系統(tǒng)中的定單狀態(tài)或1些業(yè)務(wù)需求。這里回調(diào)沒有寫出可以參考支付寶:web頁面掃碼支付、網(wǎng)站支付、支付寶即時到賬 + springmvc中的回調(diào)。

5、說明:

  1. 2維碼可以查看zxing實現(xiàn)2維碼生成和解析;微信這邊也提供了2維碼的學(xué)習(xí),大家有興趣可以看看:http://www.thonky.com/qr-code-tutorial/ 和http://coolshell.cn/articles/10590.html

  2. 隨機字符串:微信對隨機字符串的要求是不超過32位。我這邊是這樣生成的,用時間戳。
    /** * 創(chuàng)建UUID * @return */ public static synchronized String makeUUID() { Date date = new Date(); StringBuffer s = new StringBuffer(DateUtil.formatYmdhmsm(date)); return s.append((new Random().nextInt(900) + 100)).toString(); }



  3. 使用Xstream時,由于微信定義的變量名大部份使用了“_”,但是在Xstream中它是關(guān)鍵字,所以會自動變成“__”,引發(fā)報錯。詳情請看:XStream異常:對象轉(zhuǎn)為XML時,會把"_"轉(zhuǎn)成"__";報錯:(Lcom/thoughtworks/xstream/io/naming/NameCoder;)V

  4. 獲得2維碼鏈接時,只有在return_code 和result_code都為SUCCESS的時候有返回;這里我就簡單的滿足時返回,不滿足返回null,您寫的時候需要結(jié)合業(yè)務(wù)斟酌下,是不是需要增加判斷,從而滿足不同的業(yè)務(wù)場景。統(tǒng)1下單API

  5. 簽名在上面1直沒有詳細說明,首先查看微信的安全規(guī)范中簽名算法。key值,需要自己填寫
    /** * 生成簽名 * * @param appid_value * @param mch_id_value * @param productId * @param nonce_str_value * @param trade_type * @param notify_url * @param spbill_create_ip * @param total_fee * @param out_trade_no * @return */ private String createSign(UnifiedOrderRequest unifiedOrderRequest) { //根據(jù)規(guī)則創(chuàng)建可排序的map集合 SortedMap packageParams = new TreeMap(); packageParams.put("appid", unifiedOrderRequest.getAppid()); packageParams.put("body", unifiedOrderRequest.getBody()); packageParams.put("mch_id", unifiedOrderRequest.getMch_id()); packageParams.put("nonce_str", unifiedOrderRequest.getNonce_str()); packageParams.put("notify_url", unifiedOrderRequest.getNotify_url()); packageParams.put("out_trade_no", unifiedOrderRequest.getOut_trade_no()); packageParams.put("spbill_create_ip", unifiedOrderRequest.getSpbill_create_ip()); packageParams.put("trade_type", unifiedOrderRequest.getTrade_type()); packageParams.put("total_fee", unifiedOrderRequest.getTotal_fee()); StringBuffer sb = new StringBuffer(); Set es = packageParams.entrySet();//字典序 Iterator it = es.iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); String k = (String) entry.getKey(); String v = (String) entry.getValue(); //為空不參與簽名、參數(shù)名辨別大小寫 if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) { sb.append(k + "=" + v + "&"); } } //第2步拼接key,key設(shè)置路徑:微信商戶平臺(pay.weixin.qq.com)-->賬戶設(shè)置-->API安全-->密鑰設(shè)置 sb.append("key=" +"xxxxxxxxxxxxxxxxx"); String sign = MD5Util.MD5Encode(sb.toString(), "utf⑻") .toUpperCase();//MD5加密 return sign; }


相干文章:支付寶:web頁面掃碼支付、網(wǎng)站支付、支付寶即時到賬 + springmvc













生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 亚洲精品国产第一综合99久久 | 毛片在线免费播放 | av在线资源站 | 久久中出 | 九九热只有这里有精品 | 亚洲乱码一区二区 | 麻豆久久久久 | 日韩av激情 | 成人黄色在线观看 | 亚洲精品一区二区网址 | 国产精品美乳一区二区免费 | 91网站链接| 国产精品999999 | 激情国产视频 | 亚洲网站在线看 | 国产高清无密码一区二区三区 | 黄色一级视频 | 日本免费福利视频 | 亚洲青青 | 精品嫩草| 久久av一区二区 | 精品综合在线 | 中国久久 | 成人黄色小视频 | 久草在线观看首页 | 中文字幕在线亚洲 | 日韩视频一区二区三区四区 | 麻豆网址| 亚洲最大成人免费视频 | 国产高清第一页 | 欧美日韩在线看 | 国产午夜免费 | 国产精品视频观看 | 欧美碰碰碰 | 国产乱码精品一区二区三 | 黄性视频| 精品久久一二三 | 亚洲欧美日韩在线 | 在线成人| 精品久久久久久久久久久久包黑料 | 日韩在线观看av |