微信公眾號(hào)網(wǎng)頁支付summer版

該文僅對(duì)于中間這種支付方式有參考價(jià)值喲

一敢伸、開發(fā)背景

在微信公眾號(hào)中,需要進(jìn)行微信支付且為微信公眾號(hào)網(wǎng)頁支付。

二悲柱、準(zhǔn)備工作

1.申請(qǐng)商戶平臺(tái)

step1. 登錄公眾平臺(tái),點(diǎn)擊左側(cè)菜單中的微信支付些己,如圖豌鸡,

step2. 進(jìn)入支付申請(qǐng),按照指引填寫相關(guān)的信息并提交段标;

step3. 資料審核通過后涯冠,支付寶會(huì)向登記的銀行帳號(hào)打一筆款,收到款后逼庞,兩次登錄到公眾平臺(tái)填寫正確的數(shù)字蛇更,簽約成功,如圖赛糟,

注意:在申請(qǐng)支付功能的時(shí)候派任,不要申請(qǐng)成了服務(wù)商,需要的是商戶璧南。雖然服務(wù)商也具備支付功能掌逛,但在調(diào)用 接口時(shí)會(huì)比商戶復(fù)雜一點(diǎn),申請(qǐng)過程也繁瑣一點(diǎn)司倚。另外服務(wù)商和商戶是具備不同的業(yè)務(wù)功能的豆混,常見的微商場(chǎng)用的更多是商戶平臺(tái)。對(duì)于服務(wù)商和商戶的區(qū)別我理解的是动知,服務(wù)商是對(duì)商戶提供技術(shù)支持的第三方團(tuán)隊(duì)皿伺。

finally , ?通過各種審核后,支付寶會(huì)向你的郵箱發(fā)送以下信息盒粮,保存好鸵鸥,在調(diào)用接口時(shí)會(huì)用到

2.配置支付參數(shù)

如下圖,進(jìn)入公眾平臺(tái)-微信支付-開發(fā)配置拆讯,設(shè)置支付授權(quán)目錄及支付回調(diào)脂男。
如果配置的是測(cè)試目錄則還需要添加測(cè)試微信號(hào)進(jìn)入測(cè)試白名單养叛;

支付授權(quán)目錄的要求:
1、所有使用公眾號(hào)支付方式發(fā)起支付請(qǐng)求的鏈接地址宰翅,都必須在支付授權(quán)目錄之下弃甥;
2、最多設(shè)置3個(gè)支付授權(quán)目錄汁讼,且域名必須通過ICP備案淆攻;
3、頭部要包含http或https嘿架,須細(xì)化到二級(jí)或三級(jí)目錄瓶珊,以左斜杠“/”結(jié)尾。

支付回調(diào)URl:頭部要包括http或https耸彪,當(dāng)公眾平臺(tái)接到掃碼支付請(qǐng)求時(shí)伞芹,會(huì)回調(diào)此URL傳遞訂單信息。
這里指的是支付成功后蝉娜,支付寶服務(wù)器會(huì)直接調(diào)用商戶系統(tǒng)的服務(wù)器對(duì)訂單進(jìn)行處理唱较,比如修改狀態(tài)等,用戶是無感知的召川,可以當(dāng)作一個(gè)方法南缓,該方法中不支付session. 如果需要傳遞參數(shù)怎么辦了,tell you later.

二荧呐、調(diào)用接口步驟

1)獲取用戶授權(quán)(獲取openid, 獲取方式可以參考微信公眾號(hào)網(wǎng)頁授權(quán))

2)調(diào)用統(tǒng)一下單接口獲取預(yù)支付id(prepay_id)

3)H5調(diào)起微信支付的內(nèi)置JS

4)支付完成后汉形,微信回調(diào)URL的處理

看文字覺得麻煩的同志請(qǐng)參考以下稍顯形象的手繪圖,

step1. 獲取用戶授權(quán)

參考?微信公眾號(hào)網(wǎng)頁授權(quán)summer版

step2. 獲取Prepay_id

根據(jù)文檔(https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1)要求倍阐,將傳遞的參數(shù)拼接成要求的xml格式到請(qǐng)求地址:https://api.mch.weixin.qq.com/pay/unifiedorder概疆,獲得prepay_id.

如果連圖也懶得看的同志直接copy 代碼吧,貼到eclipse慢慢暈收捣,每個(gè)參數(shù)的意義都已經(jīng)加以說明

highlight的參數(shù)注意一下届案,容易被坑。

在加密時(shí)還要注意變量key罢艾。這里提個(gè)問楣颠,整個(gè)過程中加密多少次?
String sign = PayCommonUtils.createSign("UTF-8",packageParams);

key設(shè)置路徑:微信商戶平臺(tái)(pay.weixin.qq.com)-->賬戶設(shè)置-->API安全-->密鑰設(shè)置

/**

* 構(gòu)建微信統(tǒng)一支付請(qǐng)求

*/

public static SortedMap wechatPayment(HttpServletRequest request, HttpServletResponse response,) throws JDOMException, IOException {

SortedMap packageParams = new TreeMap();

//nonce_str

String currTime = CommonUtils.getCurrTime();

String strTime = currTime.substring(8, currTime.length());

String strRandom = CommonUtils.buildRandom(4) + "";

//10位序列號(hào),可以自行調(diào)整咐蚯。

String strReq = strTime + strRandom;

String nonceStr = strReq;

String signType = "MD5";

String spbillCreateIp = request.getLocalAddr();//客戶IP

/* 設(shè)置package訂單參數(shù) */

packageParams.put("appid", Constants.APPID);//微信分配的公眾賬號(hào)ID

packageParams.put("mch_id", Constants.MCH_ID);//微信支付分配的商戶號(hào)

packageParams.put("device_info", "WEB");//公眾號(hào)內(nèi)支付請(qǐng)傳"WEB"

packageParams.put("nonce_str", CommonUtils.CreateNoncestr(16));//隨機(jī)字符串童漩,不長(zhǎng)于32位

packageParams.put("sign_type", signType);//簽名類型,目前支持HMAC-SHA256和MD5春锋,默認(rèn)為MD5

packageParams.put("body", companyName);

packageParams.put("out_trade_no", orderNo);//商戶系統(tǒng)內(nèi)部的訂單號(hào),32個(gè)字符內(nèi)

packageParams.put("attach", companyId + "&" + orderIds);//傳遞的參數(shù)矫膨,在返回時(shí)會(huì)原樣 返回

packageParams.put("total_fee", CommonUtils.changeY2F(totalPrice));//訂單總金額,單位為分

packageParams.put("total_fee", "1");//訂單總金額? //測(cè)試用

packageParams.put("fee_type", "CNY");//符合ISO 4217標(biāo)準(zhǔn)的三位字母代碼,默認(rèn)人民幣:CNY

packageParams.put("notify_url", Constants.WECHAT_NOTIFY_URL);//接收微信支付異步通知回調(diào)地址

packageParams.put("spbill_create_ip", spbillCreateIp);//APP和網(wǎng)頁支付提交用戶端ip侧馅,Native支付填調(diào)用微信支付API的機(jī)器IP

//packageParams.put("time_start", new Date().toString());//訂單生成時(shí)間

packageParams.put("trade_type", "JSAPI");//JSAPI危尿,NATIVE,APP

packageParams.put("openid", openId);//openid ,關(guān)于openid的獲取請(qǐng)參考公眾號(hào)網(wǎng)頁授權(quán)

String sign = PayCommonUtils.createSign("UTF-8", packageParams);//將以上參數(shù)進(jìn)行簽名

packageParams.put("sign", sign);

packageParams.put("attach", companyId + "&" + orderIds);

String requestXML = PayCommonUtils.getRequestXml(packageParams);//生成接口需要的數(shù)據(jù)樣式

System.out.println("request xml::" + requestXML);

//請(qǐng)求的數(shù)據(jù)樣式

//

wx2421b1c4370ec43b

支付測(cè)試

JSAPI支付測(cè)試

10000100

1add1a30ac87aa2db72f57a2375d8fec

http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php

oUpF8uMuAJO_M2pxb1Q9zNjWeS6o

1415659990

14.23.150.211

1

JSAPI

0CB01533B8C1EF103065174F50BCA001

String responseStr = HttpUtils.httpsRequest(“https://api.mch.weixin.qq.com/pay/unifiedorder”, "POST", requestXML);//發(fā)送請(qǐng)求

//返回的數(shù)據(jù)樣式

//responseStr= "";

System.out.println("response str::" + responseStr);

Map map = XMLUtils.doXMLParse(responseStr);//解析微信返回的信息馁痴,以Map形式存儲(chǔ)便于取值

String returnCode = map.get("return_code");

System.out.println("get prepay_id result::" + returnCode);

SortedMap finalpackage = new TreeMap();

if ("SUCCESS".equals(returnCode)) {

/*生成最終提交訂單參數(shù)*/

String timestamp = CommonUtils.getTimeStamp();

String prepay_id = map.get("prepay_id");

System.out.println("prepay_id is :: " + prepay_id);//取得prepay_id谊娇,用于在H5調(diào)用支付api

String packages = "prepay_id=" + prepay_id;

finalpackage.put("appId", Constants.APPID);

finalpackage.put("timeStamp", timestamp);

finalpackage.put("nonceStr", nonceStr);

finalpackage.put("package", packages);

finalpackage.put("signType", signType);

String paySign = PayCommonUtils.createSign("UTF-8", finalpackage);

System.out.println("paySign is ::" + paySign);

finalpackage.put("paySign", paySign);

finalpackage.put("sendUrl", Constants.WECHAT_NOTIFY_URL); //付款成功后跳轉(zhuǎn)的頁面

finalpackage.put("errorCode", map.get("err_code_des"));

String responseJsonStr = JSONObject.toJSONString(finalpackage);

} else {

finalpackage.put("errorCode", map.get("return_msg"));

finalpackage.put("result", "failed");

}

return finalpackage;

}

step3. 網(wǎng)頁端調(diào)起支付api

將上一步取得的prepay_id存到package中,在微信js接口中將以下參數(shù)傳遞罗晕。

$('.btn-info').click(function () {

if ("1" == mPaymentType) {? ? ? //微信支付

$.ajax({

type: "post",

dataType: "json",

url: contextPath + "/order/order_payment_wechat.html",

data: {

mPaymentType: mPaymentType,

companyId: companyId,

},

}).done(function (response) {

console.log(response);

if (!isNull(response.errorCode)) {

alert(errorCode);

return false;

}

var obj = response.data;

WeixinJSBridge.invoke('getBrandWCPayRequest', {

"appId": obj.appId,? ? ? ? ? ? ? ? ? //公眾號(hào)名稱济欢,由商戶傳入

"timeStamp": obj.timeStamp,? ? ? ? ? //時(shí)間戳

"nonceStr": obj.nonceStr,? ? ? ? //隨機(jī)串

"package": obj.package,? ? ? //商品包信息

"signType": obj.signType,? ? ? ? //微信簽名方式:

"paySign": obj.paySign? ? ? //微信簽名

}, function (res) {

if (res.err_msg == "get_brand_wcpay_request:ok") {

alert('支付成功!');

} else if (res.err_msg == "get_brand_wcpay_request:cancel") {

alert("支付取消");

} else {

alert("支付失敗!");

}

});

});

}

js調(diào)用接口時(shí)會(huì)將微信支付窗口拉起,

支付成功會(huì)跳轉(zhuǎn)到如圖頁面小渊,點(diǎn)擊完成頁面會(huì)返回到回調(diào)函數(shù)中,

if (res.err_msg == "get_brand_wcpay_request:ok") {

alert('支付成功!');

}

在js調(diào)用過程中法褥,還是遇到一些錯(cuò)誤,不要驚慌酬屉,將錯(cuò)誤提示alert出來半等,或者在微信web開發(fā)者工具中console.log()出,方便調(diào)錯(cuò)

web


step4:處理支付返回值?

支付成功后梆惯,支付寶會(huì)調(diào)用之前配置的回調(diào)函數(shù)酱鸭,我們只需要用response去接受

/**

* 微信支付成功回調(diào), 這個(gè)方法是我配置的回調(diào)函數(shù)

*

*@return

*/

@RequestMapping("modify_order_status_wechat.html")

public voidmodifyOrderStatusWechat(HttpServletRequest request,HttpServletResponse response)throwsIOException {

System.out.println("i am in modify_order_status_wechat begin");

try{

String paymentResponse = WechatUtils.paymentNotify(request,response);

System.out.println("paymentResponse:"+ paymentResponse);

Map map = XMLUtils.doXMLParse(paymentResponse);

if("SUCCESS".equals(map.get("result_code"))) {

String attach = map.get("attach");// 在step1中傳遞的參數(shù)原樣取回

String attachTmp[] = attach.split("&");

Integer companyId = Integer.parseInt(attachTmp[0]);

System.out.println("companyId is :"+ companyId);

String orderIdTmp[] = attachTmp[1].split(",");

}

}catch(Exception e) {

e.printStackTrace();

}

}

/**

* 獲取支付返回值

*/

public static String paymentNotify(HttpServletRequest request,HttpServletResponse response)throwsIOException,JDOMException {

System.out.println("~~~~~~~~~~~~~~~~I am in paymentNotify~~~~~~~~~");

InputStream inStream = request.getInputStream();

ByteArrayOutputStream outSteam =newByteArrayOutputStream();

byte[] buffer =new byte[1024];

intlen =0;

while((len = inStream.read(buffer)) != -1) {

outSteam.write(buffer,0,len);

}

System.out.println("~~~~~~~~~~~~~~~~付款成功~~~~~~~~~");

outSteam.close();

inStream.close();

String result =newString(outSteam.toByteArray(),"utf-8");//獲取微信調(diào)用我們notify_url的返回信息

System.out.println("pay result is::"+ result);

Mapmap = XMLUtils.doXMLParse(result);

for(Object keyValue : map.keySet()) {

System.out.println(keyValue +"="+ map.get(keyValue));

}

if(map.get("result_code").toString().equalsIgnoreCase("SUCCESS")) {

response.getWriter().write(PayCommonUtils.setXML("SUCCESS",""));//告訴微信服務(wù)器垛吗,收到信息,不要在調(diào)用回調(diào)action了

System.out.println("-------------"+ PayCommonUtils.setXML("SUCCESS",""));

PayCommonUtils.setXML("SUCCESS","");

}else{

PayCommonUtils.setXML("Failed","");

}

return result;

}

三烁登、測(cè)試

如果頁面還沒備好怯屉,只是想測(cè)試下參數(shù)是否傳遞成功,可以使用微信提供的在線調(diào)試工具:https://pay.weixin.qq.com/wiki/tools/signverify/饵沧。

因?yàn)槲⑿沤涌趯?duì)客戶端有一些限制锨络,所有搭建測(cè)試環(huán)境有點(diǎn)費(fèi)時(shí),可以參考微信公眾號(hào)網(wǎng)頁授權(quán)summer版

四狼牺、工具類共享

在調(diào)用接口中多次使用到xml的解析羡儿,md5加密,http請(qǐng)求以及對(duì)金額的處理是钥。他們都在這里,不能上傳附件掠归,貼出來有點(diǎn)亂,但總有那么一句可能你會(huì)用到悄泥。

xml 解析(XMLUtils):

packagecom.hj.custsys.wechat.util;

importorg.jdom.Document;

importorg.jdom.Element;

importorg.jdom.JDOMException;

importorg.jdom.input.SAXBuilder;

importjava.io.ByteArrayInputStream;

importjava.io.IOException;

importjava.io.InputStream;

importjava.util.HashMap;

importjava.util.Iterator;

importjava.util.List;

importjava.util.Map;

/**

* Created by LiuBo on 2016/12/5.

*/

public classXMLUtils {

/**

* 解析xml,返回第一級(jí)元素鍵值對(duì)虏冻。如果第一級(jí)元素有子節(jié)點(diǎn),則此節(jié)點(diǎn)的值是子節(jié)點(diǎn)的xml數(shù)據(jù)弹囚。

*

*@paramstrxml

*@return

*@throwsJDOMException

*@throwsIOException

*/

public staticMapdoXMLParse(String strxml)throwsJDOMException,IOException {

strxml = strxml.replaceFirst("encoding=\".*\"","encoding=\"UTF-8\"");

if(null== strxml ||"".equals(strxml)) {

return null;

}

Map m =newHashMap();

InputStream in =newByteArrayInputStream(strxml.getBytes("UTF-8"));

SAXBuilder builder =newSAXBuilder();

Document doc = builder.build(in);

Element root = doc.getRootElement();

List list = root.getChildren();

Iterator it = list.iterator();

while(it.hasNext()) {

Element e = (Element) it.next();

String k = e.getName();

String v ="";

List children = e.getChildren();

if(children.isEmpty()) {

v = e.getTextNormalize();

}else{

v = XMLUtils.getChildrenText(children);

}

m.put(k,v);

}

//關(guān)閉流

in.close();

returnm;

}

/**

* 獲取子結(jié)點(diǎn)的xml

*

*@paramchildren

*@returnString

*/

public staticStringgetChildrenText(List children) {

StringBuffer sb =newStringBuffer();

if(!children.isEmpty()) {

Iterator it = children.iterator();

while(it.hasNext()) {

Element e = (Element) it.next();

String name = e.getName();

String value = e.getTextNormalize();

List list = e.getChildren();

sb.append("<"+ name +">");

if(!list.isEmpty()) {

sb.append(XMLUtils.getChildrenText(list));

}

sb.append(value);

sb.append("");

}

}

returnsb.toString();

}

}

簽名:

/**

*@paramcharacterEncoding編碼格式

*@paramparameters請(qǐng)求參數(shù)

*@return

*@Description:sign簽名

*/

public staticStringcreateSign(String characterEncoding,SortedMap parameters) {

StringBuffer sb =newStringBuffer();

Set es = parameters.entrySet();

Iterator it = es.iterator();

while(it.hasNext()) {

Map.Entry entry = (Map.Entry) it.next();

String k = (String) entry.getKey();

Object v = entry.getValue();

if(null!= v && !"".equals(v)

&& !"sign".equals(k) && !"key".equals(k)) {

sb.append(k +"="+ v +"&");

}

}

sb.append("key="+ Constants.WECHAT_KEY);

String sign = MD5SignUtils.MD5Encode(sb.toString(),characterEncoding);

returnsign;

}

public staticStringsetXML(String return_code,String return_msg) {

return"

+"]]>

+"]]>";

}

金額的處理:

/**

* 金額為分的格式

*/

public static finalStringCURRENCY_FEN_REGEX="\\-?[0-9]+";

/**

* 將分為單位的轉(zhuǎn)換為元并返回金額格式的字符串 (除100)

*

*@paramamount

*@return

*@throwsException

*/

public staticStringchangeF2Y(Long amount)throwsException {

if(!amount.toString().matches(CURRENCY_FEN_REGEX)) {

throw newException("金額格式有誤");

}

intflag =0;

String amString = amount.toString();

if(amString.charAt(0) =='-') {

flag =1;

amString = amString.substring(1);

}

StringBuffer result =newStringBuffer();

if(amString.length() ==1) {

result.append("0.0").append(amString);

}else if(amString.length() ==2) {

result.append("0.").append(amString);

}else{

String intString = amString.substring(0,amString.length() -2);

for(inti =1;i <= intString.length();i++) {

if((i -1) %3==0&& i !=1) {

result.append(",");

}

result.append(intString.substring(intString.length() - i,intString.length() - i +1));

}

result.reverse().append(".").append(amString.substring(amString.length() -2));

}

if(flag ==1) {

return"-"+ result.toString();

}else{

returnresult.toString();

}

}

/**

* 將分為單位的轉(zhuǎn)換為元 (除100)

*

*@paramamount

*@return

*@throwsException

*/

public staticStringchangeF2Y(String amount)throwsException {

if(!amount.matches(CURRENCY_FEN_REGEX)) {

throw newException("金額格式有誤");

}

returnBigDecimal.valueOf(Long.valueOf(amount)).divide(newBigDecimal(100)).toString();

}

/**

* 將元為單位的轉(zhuǎn)換為分 (乘100)

*

*@paramamount

*@return

*/

public staticStringchangeY2F(doubleamount) {

returnBigDecimal.valueOf(amount).multiply(newBigDecimal(100)).toString();

}

/**

* 將元為單位的轉(zhuǎn)換為分 替換小數(shù)點(diǎn)厨相,支持以逗號(hào)區(qū)分的金額

*

*@paramamount

*@return

*/

public staticStringchangeY2F(String amount) {

String currency = amount.replaceAll("\\$|\\¥|\\,","");// 處理包含, ¥

// 或者$的金額

intindex = currency.indexOf(".");

intlength = currency.length();

Long amLong =0l;

if(index == -1) {

amLong = Long.valueOf(currency +"00");

}else if(length - index >=3) {

amLong = Long.valueOf((currency.substring(0,index +3)).replace(".",""));

}else if(length - index ==2) {

amLong = Long.valueOf((currency.substring(0,index +2)).replace(".","") +0);

}else{

amLong = Long.valueOf((currency.substring(0,index +1)).replace(".","") +"00");

}

returnamLong.toString();

}

http請(qǐng)求(HttpUtils)

packagecom.hj.custsys.wechat.util.http;

importjava.io.*;

importjava.net.ConnectException;

importjava.net.MalformedURLException;

importjava.net.URL;

importjava.net.URLConnection;

importjava.util.*;

importjava.util.regex.Matcher;

importjava.util.regex.Pattern;

importjavax.net.ssl.SSLSocketFactory;

importorg.apache.commons.httpclient.NameValuePair;

importorg.apache.commons.httpclient.methods.GetMethod;

importorg.apache.commons.httpclient.methods.PostMethod;

importorg.apache.commons.httpclient.params.HttpMethodParams;

importorg.apache.http.HttpEntity;

importorg.apache.http.HttpResponse;

importorg.apache.http.HttpStatus;

importorg.apache.http.ParseException;

importorg.apache.http.client.ClientProtocolException;

importorg.apache.http.client.HttpClient;

importorg.apache.http.client.entity.UrlEncodedFormEntity;

importorg.apache.http.client.methods.HttpGet;

importorg.apache.http.client.methods.HttpPost;

importorg.apache.http.client.methods.HttpUriRequest;

importorg.apache.http.impl.client.DefaultHttpClient;

importorg.apache.http.message.BasicNameValuePair;

importorg.apache.http.protocol.HTTP;

importorg.apache.http.util.EntityUtils;

importjavax.net.ssl.TrustManager;

importjavax.net.ssl.HttpsURLConnection;

importjavax.net.ssl.SSLContext;

importjavax.servlet.http.HttpServletRequest;

public classHttpUtils{

public staticStringgetUrl(String url) {

String result =null;

try{

// 根據(jù)地址獲取請(qǐng)求

HttpGet request =newHttpGet(url);

// 獲取當(dāng)前客戶端對(duì)象

HttpClient httpClient =newDefaultHttpClient();

// 通過請(qǐng)求對(duì)象獲取響應(yīng)對(duì)象

HttpResponse response = httpClient.execute(request);

// 判斷網(wǎng)絡(luò)連接狀態(tài)碼是否正常(0--200都數(shù)正常)

if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {

result = EntityUtils.toString(response.getEntity());

}

}catch(Exception e) {

//TODO Auto-generated catch block

e.printStackTrace();

}

returnresult;

}

/**

* 發(fā)送https請(qǐng)求

*

*@paramrequestUrl請(qǐng)求地址

*@paramrequestMethod請(qǐng)求方式(GET、POST)

*@paramoutputStr提交的數(shù)據(jù)

*@return返回微信服務(wù)器響應(yīng)的信息

*/

public staticStringhttpsRequest(String requestUrl,String requestMethod,

String outputStr) {

try{

// 創(chuàng)建SSLContext對(duì)象,并使用我們指定的信任管理器初始化

TrustManager[] tm = {newTrustAnyTrustManager()};

SSLContext sslContext = SSLContext.getInstance("SSL","SunJSSE");

sslContext.init(null,tm, newjava.security.SecureRandom());

// 從上述SSLContext對(duì)象中得到SSLSocketFactory對(duì)象

SSLSocketFactory ssf = sslContext.getSocketFactory();

URL url =newURL(requestUrl);

HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();

conn.setSSLSocketFactory(ssf);

conn.setDoOutput(true);

conn.setDoInput(true);

conn.setUseCaches(false);

// 設(shè)置請(qǐng)求方式(GET/POST)

conn.setRequestMethod(requestMethod);

conn.setRequestProperty("content-type",

"application/x-www-form-urlencoded");

// 當(dāng)outputStr不為null時(shí)向輸出流寫數(shù)據(jù)

if(null!= outputStr) {

OutputStream outputStream = conn.getOutputStream();

// 注意編碼格式

outputStream.write(outputStr.getBytes("UTF-8"));

outputStream.close();

}

// 從輸入流讀取返回內(nèi)容

InputStream inputStream = conn.getInputStream();

InputStreamReader inputStreamReader =newInputStreamReader(

inputStream,"utf-8");

BufferedReader bufferedReader =newBufferedReader(

inputStreamReader);

String str =null;

StringBuffer buffer =newStringBuffer();

while((str = bufferedReader.readLine()) !=null) {

buffer.append(str);

}

// 釋放資源

bufferedReader.close();

inputStreamReader.close();

inputStream.close();

inputStream =null;

conn.disconnect();

returnbuffer.toString();

}catch(ConnectException ce) {

ce.printStackTrace();

}catch(Exception e) {

e.printStackTrace();

}

return null;

}

/**

* 發(fā)起https請(qǐng)求并獲取結(jié)果

*/

public staticStringhttpRequest(String urlStr,String xmlFileName) {

String resultStr ="";

try{

URL url =newURL(urlStr);

URLConnection con = url.openConnection();

con.setDoOutput(true);

OutputStreamWriter out =newOutputStreamWriter(con.getOutputStream());

String xmlInfo = xmlFileName;

System.out.println("urlStr="+ urlStr);

System.out.println("xmlInfo="+ xmlInfo);

out.flush();

out.close();

BufferedReader br =newBufferedReader(newInputStreamReader(con

.getInputStream()));

String line ="";

StringBuffer sb =newStringBuffer();

for(line = br.readLine();line !=null;line = br.readLine()) {

sb.append(line);

}

resultStr = sb.toString();

}catch(MalformedURLException e) {

e.printStackTrace();

}catch(IOException e) {

e.printStackTrace();

}

returnresultStr;

}

public staticStringpost(String url,Map params) {

DefaultHttpClient httpclient =newDefaultHttpClient();

String body =null;

HttpPost post =postForm(url,params);

body =invoke(httpclient,post);

httpclient.getConnectionManager().shutdown();

returnbody;

}

public staticStringget(String url) {

DefaultHttpClient httpclient =newDefaultHttpClient();

String body =null;

HttpGet get =newHttpGet(url);

body =invoke(httpclient,get);

httpclient.getConnectionManager().shutdown();

returnbody;

}

private staticStringinvoke(DefaultHttpClient httpclient,

HttpUriRequest httpost) {

HttpResponse response =sendRequest(httpclient,httpost);

String body =paseResponse(response);

returnbody;

}

private staticStringpaseResponse(HttpResponse response) {

HttpEntity entity = response.getEntity();

String charset = EntityUtils.getContentCharSet(entity);

String body =null;

try{

body = EntityUtils.toString(entity,"UTF-8");

}catch(ParseException e) {

e.printStackTrace();

}catch(IOException e) {

e.printStackTrace();

}

returnbody;

}

private staticHttpResponsesendRequest(DefaultHttpClient httpclient,

HttpUriRequest httpost) {

HttpResponse response =null;

try{

response = httpclient.execute(httpost);

}catch(ClientProtocolException e) {

e.printStackTrace();

}catch(IOException e) {

e.printStackTrace();

}

returnresponse;

}

private staticHttpPostpostForm(String url,Map params) {

HttpPost httpost =newHttpPost(url);

List nvps =newArrayList();

Set keySet = params.keySet();

for(String key : keySet) {

nvps.add(newBasicNameValuePair(key,params.get(key)));

}

try{

httpost.setEntity(newUrlEncodedFormEntity(nvps,HTTP.UTF_8));

}catch(UnsupportedEncodingException e) {

e.printStackTrace();

}

returnhttpost;

}

}


在html中調(diào)用微信js接口時(shí)蛮穿,我對(duì)官方提供的寫法很沒信心庶骄,心想沒有引入任何js文件怎么可能引用到方法,抱著試一試的想法践磅,呀单刁,居然有反映。置疑和相信都存在時(shí)音诈,帶著置疑大膽去try try try...at last , you'll trust the truth幻碱,哈哈哈...。另外细溅,在測(cè)試過程中時(shí)常會(huì)遇到一些偶發(fā)的bug, 從最初的小僥幸到現(xiàn)在的事出必有因不知放掉了多少bug,現(xiàn)在明白選擇相信科學(xué)錯(cuò)出來也不會(huì)太離譜褥傍。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市喇聊,隨后出現(xiàn)的幾起案子恍风,更是在濱河造成了極大的恐慌,老刑警劉巖誓篱,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朋贬,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡窜骄,警方通過查閱死者的電腦和手機(jī)锦募,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來邻遏,“玉大人糠亩,你說我怎么就攤上這事∽佳椋” “怎么了赎线?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)糊饱。 經(jīng)常有香客問我垂寥,道長(zhǎng),這世上最難降的妖魔是什么另锋? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任滞项,我火速辦了婚禮,結(jié)果婚禮上砰蠢,老公的妹妹穿的比我還像新娘蓖扑。我一直安慰自己,他們只是感情好台舱,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布律杠。 她就那樣靜靜地躺著潭流,像睡著了一般。 火紅的嫁衣襯著肌膚如雪柜去。 梳的紋絲不亂的頭發(fā)上灰嫉,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音嗓奢,去河邊找鬼讼撒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛股耽,可吹牛的內(nèi)容都是我干的根盒。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼物蝙,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼炎滞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起诬乞,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤册赛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后震嫉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體森瘪,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年票堵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扼睬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡悴势,死狀恐怖痰驱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瞳浦,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布废士,位于F島的核電站叫潦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏官硝。R本人自食惡果不足惜矗蕊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望氢架。 院中可真熱鬧傻咖,春花似錦、人聲如沸岖研。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至害淤,卻和暖如春扇雕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背窥摄。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國(guó)打工镶奉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人崭放。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓哨苛,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親币砂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子建峭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)道伟,斷路器迹缀,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • 9af0e05c6c75閱讀 355評(píng)論 0 0
  • Spark SQL, DataFrames and Datasets Guide Overview SQL Dat...
    Joyyx閱讀 8,320評(píng)論 0 16
  • 經(jīng)濟(jì)轉(zhuǎn)型躏救,一直以來是社會(huì)上下關(guān)注的焦點(diǎn)話題。在“大眾創(chuàng)業(yè)奈梳、萬眾創(chuàng)新”的號(hào)召下射富,中國(guó)的創(chuàng)新力與日俱增。蘇州市政府在此...
    投資人說閱讀 269評(píng)論 0 0
  • 即使知道這個(gè)是錯(cuò)的盆色,但是你還是去做了灰蛙。 太多太多不應(yīng)該,從來沒有想過會(huì)以這種方式去結(jié)束一件我認(rèn)為現(xiàn)在的我可以做的...
    Serafina_ZJ閱讀 302評(píng)論 0 0