本文實例講述了Java編程調(diào)用微信支付功能的方法。分享給大家供大家參考,具體如下:
公司主營業(yè)務(wù):成都網(wǎng)站制作、做網(wǎng)站、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出惠農(nóng)免費做網(wǎng)站回饋大家。
微信開發(fā)文檔地址:https://mp.weixin.qq.com/wiki/home/
從調(diào)用處開始
我的流程: 1.點擊“支付”按鈕,去后臺 —-> 2.后臺生成支付所需數(shù)據(jù)返回頁面 —-> 3.頁面點擊“確認支付”調(diào)用微信支付js。完成支付功能。
支付按鈕
支付
支付按鈕js
function payBox(){ //獲得支付的錢數(shù) var money = $(".money input").val(); //后臺路徑,加上參數(shù) location.href = "/XXX/XXX/XXXX/XXXX?money ="+money; }
后臺方法(例:index())
注釋:
getPara( ) == request.getParameter(name);
setAttr( ) == request.setAttribute(name, value);
render() == 我現(xiàn)在所用框架返回頁面的一種方法。
首先得OpenId;下面是具體方法。
public String getOpenId(){ String code = getPara("code"); String openid = ""; if (StringUtils.isEmpty(openid) && !StringUtils.isEmpty(code)) { SnsAccessToken token = SnsAccessTokenApi.getSnsAccessToken("你的APPID","你的appsecret密碼", code); openid = token.getOpenid(); } getSession().setAttribute("openandid",openid); return openid; } public void index() throws Exception{ String openid = getOpenId(); //得到金額 String money= getPara("money"); Mapmap=new HashMap (); //獲取隨機串 String nonceStr=UUID.randomUUID().toString().substring(0, 32); //可以是支付物品的訂單號。一個號碼,看自己怎么給 String out_trade_no="123456789"; //支付金額。微信默認支付是(1=0.01)的比例,下面是將金額換算成微信可識別的 BigDecimal re1=new BigDecimal(expressCharge); BigDecimal re2=new BigDecimal(Float.toString(100.00f)); Float aa = re1.multiply(re2).floatValue(); String total_fee = String.valueOf(aa); String[] smill = total_fee.split("\\."); total_fee = smill[0]; //微信的appid String appid="XXXXXXXXXXXXXXXXX"; String mch_id="XXXXXXXXX";//商戶號 String body="xxxxxxx";//商品信息,可以自己起最好寫英文 //密匙,商戶平臺的支付API密匙,注意是商戶平臺,不是微信平臺 String key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXX"; long timestamp = System.currentTimeMillis() / 1000; map.put("appid", appid ); map.put("mch_id", mch_id); map.put("nonce_str",nonceStr); map.put("body", body); map.put("out_trade_no", out_trade_no); map.put("total_fee", total_fee); map.put("spbill_create_ip",getRequest().getRemoteAddr()); //這里是支付成功后返回的地址,微信會以XML形式放回數(shù)據(jù),就是本篇文章的下一類(例:wxxml())方法名。 map.put("notify_url", "http://www.XXXX.com/XXXX/XXXX/xxxx/wxxml"); map.put("trade_type", "JSAPI"); map.put("openid", openid);//傳入OpenId //這里傳入Map集合和key商戶支付密匙 String paySign=getPayCustomSign(map,key); map.put("sign",paySign); //將map轉(zhuǎn)為XML格式 String xml= ArrayToXml(map); //統(tǒng)一下單,這里不用改 String url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; String xmlStr = HttpKit.post(url, xml); //prepayid由微信返回的 。 String prepayid = ""; if (xmlStr.indexOf("SUCCESS") != -1) { Map map2 = doXMLParse(xmlStr); prepayid = (String) map2.get("prepay_id"); } String paySign2=getPayCustomSign(signMap,key); setAttr("model", model); setAttr("appId", appid); setAttr("paytimestamp", String.valueOf(timestamp)); setAttr("paynonceStr", nonceStr); setAttr("paypackage", "prepay_id="+prepayid); setAttr("paysignType","MD5"); setAttr("paySign", paySign2); //去到確認支付頁面,返回頁面方式不同,(例:pay.html頁面),下面 render("/XXXX/pay.html"); } /** * 獲取支付所需簽名 * @param ticket * @param timeStamp * @param card_id * @param code * @return * @throws Exception */ public static String getPayCustomSign(Map bizObj,String key) throws Exception { String bizString = FormatBizQueryParaMap(bizObj, false); return sign(bizString, key); } /** * 字典排序 * @param paraMap * @param urlencode * @return * @throws Exception */ public static String FormatBizQueryParaMap(Map paraMap, boolean urlencode) throws Exception { String buff = ""; try { List > infoIds = new ArrayList >(paraMap.entrySet()); Collections.sort(infoIds, new Comparator >() { public int compare(Map.Entry o1, Map.Entry o2) { return (o1.getKey()).toString().compareTo( o2.getKey()); } }); for (int i = 0; i < infoIds.size(); i++) { Map.Entry item = infoIds.get(i); //System.out.println(item.getKey()); if (item.getKey() != "") { String key = item.getKey(); String val = item.getValue(); if (urlencode) { val = URLEncoder.encode(val, "utf-8"); } buff += key + "=" + val + "&"; } } if (buff.isEmpty() == false) { buff = buff.substring(0, buff.length() - 1); } } catch (Exception e) { throw new Exception(e.getMessage()); } return buff; } //支付所需簽名處調(diào)用此方法 public static String sign(String content, String key) throws Exception{ String signStr = ""; signStr = content + "&key=" + key; return MD5(signStr).toUpperCase(); } //上一方法,MD5加密處理 public final static String MD5(String s) { char hexDigits[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; try { byte[] btInput = s.getBytes(); MessageDigest mdInst = MessageDigest.getInstance("MD5"); mdInst.update(btInput); byte[] md = mdInst.digest(); int j = md.length; char str[] = new char[j * 2]; int k = 0; for (int i = 0; i < j; i++) { byte byte0 = md[i]; str[k++] = hexDigits[byte0 >>> 4 & 0xf]; str[k++] = hexDigits[byte0 & 0xf]; } return new String(str); } catch (Exception e) { e.printStackTrace(); return null; } } //轉(zhuǎn)為XML格式 public static String ArrayToXml(Map arr) { String xml = " "; Iterator "; return xml; } public static boolean IsNumeric(String str) { if (str.matches("\\d *")) { return true; } else { return false; } } //解析XML private Map> iter = arr.entrySet().iterator(); while (iter.hasNext()) { Entry entry = iter.next(); String key = entry.getKey(); String val = entry.getValue(); if (IsNumeric(val)) { xml += "<" + key + ">" + val + "" + key + ">"; } else xml += "<" + key + ">" + key + ">"; } xml += " doXMLParse(String xml) throws XmlPullParserException, IOException { InputStream inputStream = new ByteArrayInputStream(xml.getBytes()); Map map = null; XmlPullParser pullParser = XmlPullParserFactory.newInstance() .newPullParser(); pullParser.setInput(inputStream, "UTF-8");// 為xml設(shè)置要解析的xml數(shù)據(jù) int eventType = pullParser.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_DOCUMENT: map = new HashMap (); break; case XmlPullParser.START_TAG: String key = pullParser.getName(); if (key.equals("xml")) break; String value = pullParser.nextText(); map.put(key, value); break; case XmlPullParser.END_TAG: break; } eventType = pullParser.next(); } return map; }
pay頁面(上面步驟執(zhí)行完后去的頁面)
此處是頁面js代碼,接受后臺代碼傳回來的參數(shù)?,F(xiàn)在用的是BSL模板引擎,參數(shù)可以以EL表達式方式接收??上葘⒑笈_傳會的參數(shù),放在幾個input類型type=”hidden”標簽標簽中。
js中得到值
var appid = $("#appid").val();
js引用
下面是JS代碼,由于是bsl,自己看著傳參數(shù)吧,反正都是后臺來的。
確認支付
//先寫一個點擊事件,當(dāng)點擊id為onlinePayNow的按鈕時,觸發(fā)該事件。 $("#onlinePayNow").click(function getpay(){ if (typeof WeixinJSBridge=="undefined") { if (document.addEventListener) {document.addEventListener('WeixinJSBridgeReady',onBridgeReady,false); }else if(document.attachEvent){document.attachEvent('WeixinJSBridgeReady',onBridgeReady);document.attachEvent('onWeixinJSBridgeReady',onBridgeReady); } }else{ //如果報錯,可用下面方法看看是不是參數(shù)缺少。 /* alert('${appId}'); alert('${paytimestamp}'); alert('${paynonceStr}'); alert('${paypackage}'); alert('${paysignType}'); alert('${paySign}'); */ //調(diào)用下面方法。開啟微信支付。 onBridgeReady(); } }) function onBridgeReady(){ WeixinJSBridge.invoke('getBrandWCPayRequest', { "appId" : '${appId}', //公眾號名稱,由商戶傳入 "timeStamp" : '${paytimestamp}', //時間戳,自1970年以來的秒數(shù) "nonceStr" : '${paynonceStr}', //隨機串 "package" : '${paypackage}', "signType" : '${paysignType}', //微信簽名方式: "paySign" : '${paySign}' //微信簽名 }, function(res) { //alert(res.err_msg); // 使用以上方式判斷前端返回,微信團隊鄭重提示:res.err_msg將在用戶支付成功后返 if(res.err_msg == "get_brand_wcpay_request:ok"){ //支付成功,完成后去到哪個頁面。 window.location.href="/XXXX/xxxx.html" rel="external nofollow" ; } }); }
在微信公眾平臺配置,支付授權(quán)目錄。
授權(quán)目錄建議:
http://www.XXXX.com/XXXX/xxx/index/
我覺得最好寫后臺是action地址就寫Action地址,Controller就寫Controller地址,如果有Spring注解,就寫注解后名稱。
我所導(dǎo)入的包(java后臺,就是index方法。)
import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.math.BigDecimal; import java.net.URLEncoder; import java.security.MessageDigest; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.UUID; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserFactory; import com.jfinal.kit.HttpKit; import com.uitrs.express.common.Constants;
更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java字符與字符串操作技巧總結(jié)》、《Java數(shù)組操作技巧總結(jié)》、《Java數(shù)學(xué)運算技巧總結(jié)》、《Java編碼操作技巧總結(jié)》和《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》
希望本文所述對大家java程序設(shè)計有所幫助。