某些情況下,我們的form需要提交到不是自己的web服務地址,如果對端的編碼格式和自己的編碼格式不一樣,提交過去的中文就會出現亂碼,應該怎么處理呢?
這個時候,需要告訴瀏覽器,我們的數據應該按照對端要求的編碼格式進行數據封裝。換句話說,需要在客戶端(瀏覽器)設置編碼格式。
javascript表單提交模式
Js代碼
var postform = document.getElementById('postform');
if (document.charset) {
document.charset = 'gbk'; //設置提交的編碼為gbk IE不能識別form.accept-charset
} else {
//設置編碼gbk,不能夠解析 document.charset的瀏覽器,用form.accept-charset參數
postform.setAttribute('accept-charset', 'gbk');
}
postform.submit();
當然也可以在form表單上直接設置編碼屬性
Html代碼
<form action="xxx" method="post" accept-charset="gbk" _charset="gbk">
</form>
_charset屬性特別針對IE瀏覽器,但是這個我在實際操作中好像沒起作用,你們可以試試。
.提交頁面:
<%@ page contentType="text/html;charset=GBK"%>
<%@ page import="java.net.*" %>
<html>
<head>
<title>get傳參亂碼</title>
</head>
<body>
<%
String spath="c:/temp/采用了一種可變長的編碼方式,即將常用的字符編碼成較短的序列,而不常用的字符用較長的序列表示,這樣讓編碼占用更少存儲空間的同時也保證了對龐大字符集的支持";
String spath1=URLEncoder.encode(spath, "UTF-8");
System.out.println("1===="+spath1);
String spath2= new String(spath.getBytes("UTF-8"),"GBK");
System.out.println("2===="+spath2);
String srcString = spath;
//String srcString = "我們是中國人";
String utf2GbkString = new String(srcString.getBytes("UTF-8"),"GBK");
System.out.println("3---UTF-8轉換成GBK:"+utf2GbkString);
String utf2Gbk2UtfString = new String(utf2GbkString.getBytes("GBK"),"UTF-8");
System.out.println("4---UTF-8轉換成GBK再轉成UTF-8:"+utf2Gbk2UtfString);
%>
<!--
<form name="form1" action="login_do.jsp" method="GET">
http://localhost:8080/roomss/login_do.jsp?username=%D0%D5%C3%FB&password=
-->
<form name="form1" action="login_do.jsp" method="post">
<input type="text" name="spath1" value="<%=spath1%>"><br>
<input type="text" name="spath2" value="<%=spath2%>"><br>
<input type="text" name="utf2GbkString" value="<%=utf2GbkString%>"><br>
<input type="password" name="password"/>
<input type="submit" value="提交"/>
</form>
<script type="text/javascript">
</script>
</body>
</html>
2.接受頁面:
<%@ page contentType="text/html;charset=GBK"%>
<%@ page import="java.net.*" %>
<%
String spath1=request.getParameter("spath1");//utf8
String spath2=request.getParameter("spath2");//utf8gbk
System.out.println("1==spath1="+spath1);
System.out.println("2==spath1="+URLDecoder.decode(spath1,"UTF-8"));
System.out.println("3==spath2="+spath2);
String utf2GbkString = request.getParameter("utf2GbkString");
System.out.println("2---UTF-8轉換成GBK:"+utf2GbkString);
String utf2Gbk2UtfString = new String(utf2GbkString.getBytes("GBK"),"UTF-8");
System.out.println("2---UTF-8轉換成GBK再轉成UTF-8:"+utf2Gbk2UtfString);
%>
3.結果:
1====c%3A%2Ftemp%2F%E9%87%87%E7%94%A8%E4%BA%86%E4%B8%80%E7%A7%8D%E5%8F%AF%E5%8F%98%E9%95%BF%E7%9A%84%E7%BC%96%E7%A0%81%E6%96%B9%E5%BC%8F%EF%BC%8C%E5%8D%B3%E5%B0%86%E5%B8%B8%E7%94%A8%E7%9A%84%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81%E6%88%90%E8%BE%83%E7%9F%AD%E7%9A%84%E5%BA%8F%E5%88%97%EF%BC%8C%E8%80%8C%E4%B8%8D%E5%B8%B8%E7%94%A8%E7%9A%84%E5%AD%97%E7%AC%A6%E7%94%A8%E8%BE%83%E9%95%BF%E7%9A%84%E5%BA%8F%E5%88%97%E8%A1%A8%E7%A4%BA%EF%BC%8C%E8%BF%99%E6%A0%B7%E8%AE%A9%E7%BC%96%E7%A0%81%E5%8D%A0%E7%94%A8%E6%9B%B4%E5%B0%91%E5%AD%98%E5%82%A8%E7%A9%BA%E9%97%B4%E7%9A%84%E5%90%8C%E6%97%B6%E4%B9%9F%E4%BF%9D%E8%AF%81%E4%BA%86%E5%AF%B9%E5%BA%9E%E5%A4%A7%E5%AD%97%E7%AC%A6%E9%9B%86%E7%9A%84%E6%94%AF%E6%8C%81
2====c:/temp/閲囩敤浜嗕竴縐嶅彲鍙橀暱鐨勭紪鐮佹柟寮忥紝鍗沖皢甯哥敤鐨勫瓧絎︾紪鐮佹垚杈冪煭鐨勫簭鍒楋紝鑰屼笉甯哥敤鐨勫瓧絎︾敤杈冮暱鐨勫簭鍒楄〃紺猴紝榪欐牱璁╃紪鐮佸崰鐢ㄦ洿灝戝瓨鍌ㄧ┖闂寸殑鍚屾椂涔熶繚璇佷簡瀵瑰簽澶у瓧絎﹂泦鐨勬敮鎸?
3---UTF-8轉換成GBK:c:/temp/閲囩敤浜嗕竴縐嶅彲鍙橀暱鐨勭紪鐮佹柟寮忥紝鍗沖皢甯哥敤鐨勫瓧絎︾紪鐮佹垚杈冪煭鐨勫簭鍒楋紝鑰屼笉甯哥敤鐨勫瓧絎︾敤杈冮暱鐨勫簭鍒楄〃紺猴紝榪欐牱璁╃紪鐮佸崰鐢ㄦ洿灝戝瓨鍌ㄧ┖闂寸殑鍚屾椂涔熶繚璇佷簡瀵瑰簽澶у瓧絎﹂泦鐨勬敮鎸?
4---UTF-8轉換成GBK再轉成UTF-8:c:/temp/采用了一種可變長的編碼方式,即將常用的字符編碼成較短的序列,而不常用的字符用較長的序列表示,這樣讓編碼占用更少存儲空間的同時也保證了對龐大字符集的支??
1==spath1=c%3A%2Ftemp%2F%E9%87%87%E7%94%A8%E4%BA%86%E4%B8%80%E7%A7%8D%E5%8F%AF%E5%8F%98%E9%95%BF%E7%9A%84%E7%BC%96%E7%A0%81%E6%96%B9%E5%BC%8F%EF%BC%8C%E5%8D%B3%E5%B0%86%E5%B8%B8%E7%94%A8%E7%9A%84%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81%E6%88%90%E8%BE%83%E7%9F%AD%E7%9A%84%E5%BA%8F%E5%88%97%EF%BC%8C%E8%80%8C%E4%B8%8D%E5%B8%B8%E7%94%A8%E7%9A%84%E5%AD%97%E7%AC%A6%E7%94%A8%E8%BE%83%E9%95%BF%E7%9A%84%E5%BA%8F%E5%88%97%E8%A1%A8%E7%A4%BA%EF%BC%8C%E8%BF%99%E6%A0%B7%E8%AE%A9%E7%BC%96%E7%A0%81%E5%8D%A0%E7%94%A8%E6%9B%B4%E5%B0%91%E5%AD%98%E5%82%A8%E7%A9%BA%E9%97%B4%E7%9A%84%E5%90%8C%E6%97%B6%E4%B9%9F%E4%BF%9D%E8%AF%81%E4%BA%86%E5%AF%B9%E5%BA%9E%E5%A4%A7%E5%AD%97%E7%AC%A6%E9%9B%86%E7%9A%84%E6%94%AF%E6%8C%81
2==spath1=c:/temp/采用了一種可變長的編碼方式,即將常用的字符編碼成較短的序列,而不常用的字符用較長的序列表示,這樣讓編碼占用更少存儲空間的同時也保證了對龐大字符集的支持
3==spath2=c:/temp/采用了一種可變長的編碼方式,即將常用的字符編碼成較短的序列,而不常用的字符用較長的序列表示,這樣讓編碼占用更少存儲空間的同時也保證了對龐大字符集的支??
2---UTF-8杞崲鎴怗BK錛?c:/temp/采用了一種可變長的編碼方式,即將常用的字符編碼成較短的序列,而不常用的字符用較長的序列表示,這樣讓編碼占用更少存儲空間的同時也保證了對龐大字符集的支??
2---UTF-8杞崲鎴怗BK鍐嶈漿鎴怳TF-8錛?c:/temp/??????????????????????????????????????????У??????????????y???????б???????????????????洢??????????????????????????
1====c%3A%2Ftemp%2F%E9%87%87%E7%94%A8%E4%BA%86%E4%B8%80%E7%A7%8D%E5%8F%AF%E5%8F%98%E9%95%BF%E7%9A%84%E7%BC%96%E7%A0%81%E6%96%B9%E5%BC%8F%EF%BC%8C%E5%8D%B3%E5%B0%86%E5%B8%B8%E7%94%A8%E7%9A%84%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81%E6%88%90%E8%BE%83%E7%9F%AD%E7%9A%84%E5%BA%8F%E5%88%97%EF%BC%8C%E8%80%8C%E4%B8%8D%E5%B8%B8%E7%94%A8%E7%9A%84%E5%AD%97%E7%AC%A6%E7%94%A8%E8%BE%83%E9%95%BF%E7%9A%84%E5%BA%8F%E5%88%97%E8%A1%A8%E7%A4%BA%EF%BC%8C%E8%BF%99%E6%A0%B7%E8%AE%A9%E7%BC%96%E7%A0%81%E5%8D%A0%E7%94%A8%E6%9B%B4%E5%B0%91%E5%AD%98%E5%82%A8%E7%A9%BA%E9%97%B4%E7%9A%84%E5%90%8C%E6%97%B6%E4%B9%9F%E4%BF%9D%E8%AF%81%E4%BA%86%E5%AF%B9%E5%BA%9E%E5%A4%A7%E5%AD%97%E7%AC%A6%E9%9B%86%E7%9A%84%E6%94%AF%E6%8C%81
2====c:/temp/閲囩敤浜嗕竴縐嶅彲鍙橀暱鐨勭紪鐮佹柟寮忥紝鍗沖皢甯哥敤鐨勫瓧絎︾紪鐮佹垚杈冪煭鐨勫簭鍒楋紝鑰屼笉甯哥敤鐨勫瓧絎︾敤杈冮暱鐨勫簭鍒楄〃紺猴紝榪欐牱璁╃紪鐮佸崰鐢ㄦ洿灝戝瓨鍌ㄧ┖闂寸殑鍚屾椂涔熶繚璇佷簡瀵瑰簽澶у瓧絎﹂泦鐨勬敮鎸?
3---UTF-8轉換成GBK:c:/temp/閲囩敤浜嗕竴縐嶅彲鍙橀暱鐨勭紪鐮佹柟寮忥紝鍗沖皢甯哥敤鐨勫瓧絎︾紪鐮佹垚杈冪煭鐨勫簭鍒楋紝鑰屼笉甯哥敤鐨勫瓧絎︾敤杈冮暱鐨勫簭鍒楄〃紺猴紝榪欐牱璁╃紪鐮佸崰鐢ㄦ洿灝戝瓨鍌ㄧ┖闂寸殑鍚屾椂涔熶繚璇佷簡瀵瑰簽澶у瓧絎﹂泦鐨勬敮鎸?
4---UTF-8轉換成GBK再轉成UTF-8:c:/temp/采用了一種可變長的編碼方式,即將常用的字符編碼成較短的序列,而不常用的字符用較長的序列表示,這樣讓編碼占用更少存儲空間的同時也保證了對龐大字符集的支??
1====c%3A%2Ftemp%2F%E9%87%87%E7%94%A8%E4%BA%86%E4%B8%80%E7%A7%8D%E5%8F%AF%E5%8F%98%E9%95%BF%E7%9A%84%E7%BC%96%E7%A0%81%E6%96%B9%E5%BC%8F%EF%BC%8C%E5%8D%B3%E5%B0%86%E5%B8%B8%E7%94%A8%E7%9A%84%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81%E6%88%90%E8%BE%83%E7%9F%AD%E7%9A%84%E5%BA%8F%E5%88%97%EF%BC%8C%E8%80%8C%E4%B8%8D%E5%B8%B8%E7%94%A8%E7%9A%84%E5%AD%97%E7%AC%A6%E7%94%A8%E8%BE%83%E9%95%BF%E7%9A%84%E5%BA%8F%E5%88%97%E8%A1%A8%E7%A4%BA%EF%BC%8C%E8%BF%99%E6%A0%B7%E8%AE%A9%E7%BC%96%E7%A0%81%E5%8D%A0%E7%94%A8%E6%9B%B4%E5%B0%91%E5%AD%98%E5%82%A8%E7%A9%BA%E9%97%B4%E7%9A%84%E5%90%8C%E6%97%B6%E4%B9%9F%E4%BF%9D%E8%AF%81%E4%BA%86%E5%AF%B9%E5%BA%9E%E5%A4%A7%E5%AD%97%E7%AC%A6%E9%9B%86%E7%9A%84%E6%94%AF%E6%8C%81
2====c:/temp/閲囩敤浜嗕竴縐嶅彲鍙橀暱鐨勭紪鐮佹柟寮忥紝鍗沖皢甯哥敤鐨勫瓧絎︾紪鐮佹垚杈冪煭鐨勫簭鍒楋紝鑰屼笉甯哥敤鐨勫瓧絎︾敤杈冮暱鐨勫簭鍒楄〃紺猴紝榪欐牱璁╃紪鐮佸崰鐢ㄦ洿灝戝瓨鍌ㄧ┖闂寸殑鍚屾椂涔熶繚璇佷簡瀵瑰簽澶у瓧絎﹂泦鐨勬敮鎸?
3---UTF-8轉換成GBK:c:/temp/閲囩敤浜嗕竴縐嶅彲鍙橀暱鐨勭紪鐮佹柟寮忥紝鍗沖皢甯哥敤鐨勫瓧絎︾紪鐮佹垚杈冪煭鐨勫簭鍒楋紝鑰屼笉甯哥敤鐨勫瓧絎︾敤杈冮暱鐨勫簭鍒楄〃紺猴紝榪欐牱璁╃紪鐮佸崰鐢ㄦ洿灝戝瓨鍌ㄧ┖闂寸殑鍚屾椂涔熶繚璇佷簡瀵瑰簽澶у瓧絎﹂泦鐨勬敮鎸?
4---UTF-8轉換成GBK再轉成UTF-8:c:/temp/采用了一種可變長的編碼方式,即將常用的字符編碼成較短的序列,而不常用的字符用較長的序列表示,這樣讓編碼占用更少存儲空間的同時也保證了對龐大字符集的支??
1==spath1=c%3A%2Ftemp%2F%E9%87%87%E7%94%A8%E4%BA%86%E4%B8%80%E7%A7%8D%E5%8F%AF%E5%8F%98%E9%95%BF%E7%9A%84%E7%BC%96%E7%A0%81%E6%96%B9%E5%BC%8F%EF%BC%8C%E5%8D%B3%E5%B0%86%E5%B8%B8%E7%94%A8%E7%9A%84%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81%E6%88%90%E8%BE%83%E7%9F%AD%E7%9A%84%E5%BA%8F%E5%88%97%EF%BC%8C%E8%80%8C%E4%B8%8D%E5%B8%B8%E7%94%A8%E7%9A%84%E5%AD%97%E7%AC%A6%E7%94%A8%E8%BE%83%E9%95%BF%E7%9A%84%E5%BA%8F%E5%88%97%E8%A1%A8%E7%A4%BA%EF%BC%8C%E8%BF%99%E6%A0%B7%E8%AE%A9%E7%BC%96%E7%A0%81%E5%8D%A0%E7%94%A8%E6%9B%B4%E5%B0%91%E5%AD%98%E5%82%A8%E7%A9%BA%E9%97%B4%E7%9A%84%E5%90%8C%E6%97%B6%E4%B9%9F%E4%BF%9D%E8%AF%81%E4%BA%86%E5%AF%B9%E5%BA%9E%E5%A4%A7%E5%AD%97%E7%AC%A6%E9%9B%86%E7%9A%84%E6%94%AF%E6%8C%81
2==spath1=c:/temp/采用了一種可變長的編碼方式,即將常用的字符編碼成較短的序列,而不常用的字符用較長的序列表示,這樣讓編碼占用更少存儲空間的同時也保證了對龐大字符集的支持
3==spath2=c:/temp/采用了一種可變長的編碼方式,即將常用的字符編碼成較短的序列,而不常用的字符用較長的序列表示,這樣讓編碼占用更少存儲空間的同時也保證了對龐大字符集的支??
2---UTF-8杞崲鎴怗BK錛?c:/temp/采用了一種可變長的編碼方式,即將常用的字符編碼成較短的序列,而不常用的字符用較長的序列表示,這樣讓編碼占用更少存儲空間的同時也保證了對龐大字符集的支??
2---UTF-8杞崲鎴怗BK鍐嶈漿鎴怳TF-8錛?c:/temp/??????????????????????????????????????????У??????????????y???????б???????????????????洢??????????????????????????
解決OK
里對于設置支付寶賬號和配置就不做說明,網上很多配置信息和應用上線的文章
做第三方接口首先得看官方文檔,支付寶的官方文檔非常清晰:
首先登錄支付寶的開放文檔,下載支付寶SDK和demo,鏈接:
https://docs.open.alipay.com/54/106370/
將jar包導入項目,在Java服務端生成訂單信息:
//實例化客戶端
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2");
//實例化具體API對應的request類,類名稱和接口名稱對應,當前調用接口名稱:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
//SDK已經封裝掉了公共參數,這里只需要傳入業務參數。以下方法為sdk的model入參方式(model和biz_content同時存在的情況下取biz_content)。
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setBody("我是測試數據");
model.setSubject("App支付測試Java");
model.setOutTradeNo(outtradeno);//更換為自己的訂單編號
model.setTimeoutExpress("30m");
model.setTotalAmount("0.01");//訂單價格
model.setProductCode("QUICK_MSECURITY_PAY");
request.setBizModel(model);
request.setNotifyUrl("商戶外網可以訪問的異步地址");//回調地址不可以帶參數
String orderStr = "";
try {
//這里和普通的接口調用不同,使用的是sdkExecute
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
orderStr = response.getBody();
System.out.println(orderStr);//就是orderString 可以直接給客戶端請求,無需再做處理。
} catch (AlipayApiException e) {
e.printStackTrace();
}
說的簡直太詳細,只需要替換自己的訂單ID和價格就可以了,這里我們只需要把orderStr返回給客戶端就可以了,我是通過json返回的,當然客戶端完成支付之后,服務端還需要知道支付結果,或者將支付的訂單信息存入數據庫,那么我們需要設置回調地址,即setNotifyUrl,支付寶服務端通過這個地址將支付結果返回給后臺服務端,在這里我們可以更改訂單狀態,插入訂單信息等等。(注:這個的回調地址必須是外網可以訪問的,不然收不到支付寶返回的信息,這個地址即我們在開發配置中設置的授權回調地址)
回調頁面內容嚴格按照支付寶規定:
<%@ page language="java" contentType="text/html; charset=gbk" pageEncoding="gbk"%>
<%@page import="com.alipay.api.internal.util.AlipaySignature"%>
<%@ page import="java.util.*"%>
<%@ page import="java.util.Map"%>
<%@ page import="com.alipay.*"%>
<%@ page import="com.alipay.api.*"%>
<%
//獲取支付寶POST過來反饋信息
Map<String,String> params = new HashMap<String,String>();
System.out.println("異步通知參數:");
Map<String,String[]> requestParams = request.getParameterMap();
for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
if(name.equals("trade_status")){
System.out.println("交易狀態為:"+valueStr);
}
//亂碼解決,這段代碼在出現亂碼時使用。如果mysign和sign不相等也可以使用這段代碼轉化
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
params.put(name, valueStr);
}
System.out.println("params"+params);
String pk = "自己的支付寶公鑰";
//獲取支付寶的通知返回參數
//商戶訂單號
String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");
//支付寶交易號
String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");
//客戶訂單編號
String auth_app_id = new String(request.getParameter("auth_app_id").getBytes("ISO-8859-1"),"UTF-8");
//買家登錄支付寶id
String buyer_logon_id = new String(request.getParameter("buyer_logon_id").getBytes("ISO-8859-1"),"UTF-8");
//交易時間
String gmt_payment = new String(request.getParameter("gmt_payment").getBytes("ISO-8859-1"),"UTF-8");
//交易金額
String invoice_amount = new String(request.getParameter("invoice_amount").getBytes("ISO-8859-1"),"UTF-8");
boolean verify_result = AlipaySignature.rsaCheckV1(params,pk, "UTF-8", "RSA2");
//這里可以做處理修改訂單狀態
if(verify_result){//驗證成功
//支付成功只需要返回success
System.out.println(1);
out.println("success"); //請不要修改或刪除
}else{//驗證失敗
System.out.println(2);
out.println("fail");
}
%>
需要修改訂單狀態時在回調頁面根據out_trade_no改變訂單狀態就可以。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。