最近公司需要開發(fā)微信商城,然后各種作微信的東西啊,各種看API,頭大,這里先記錄下來以免后面忘記了~
首先是微信提供的api地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6
效果圖:
還是那句話,第三方的東西做一遍跟做一百遍效果是一樣的,直接上代碼咯~
=================================老司機(jī)開車咯==============================
order.jsp頁面的關(guān)鍵代碼:
- var appId = "";
- var timeStamp = "";
- var nonceStr = "";
- var pg = "";
- var signType = "";
- var paySign = "";
-
- //開始支付
- function paymentOrder(){
- var sta = $("#sta").val();
-
- if(sta==0){
- var addressId = $("#addressId").val();
-
- if(addressId==''||addressId==null){
- alert("請先選擇收貨地址");
- return;
- }
-
- var pm = $("#selPayWays").val();
-
- if(pm==0){
- //賬戶余額
- var userAccount = $("#userAccount").val();
- var main_price = $(".main-price").html();
-
- if(parseInt(userAccount)<parseInt(main_price)){
- alert("賬戶余額不足,請選擇其它的支付方式!");
- return false;
- }
- $("#form1").submit();
- }else if(pm==2){
- //微信支付
- var oids = '${oids}';
- //ajax獲取到相關(guān)參數(shù)
- $.ajax({
- url: '/***/***/wxpayOrder?addressId='+addressId+"&oids="+oids,
- type: 'GET',
- cache:false,
- async:false,
- dataType: 'JSON',
- timeout: 5000,
- error: function(textStatus){alert('系統(tǒng)錯誤~');},
- success: function(msg){
-
- if(msg!=null){
- appId = msg.appId;
- timeStamp = msg.timeStamp;
- nonceStr = msg.nonceStr;
- pg = msg.prepay_id;
- signType = msg.signType;
- paySign = msg.sign;
- }
- }
- });
- //喚起微信支付
- if(appId!=''){
- pay();
- }
-
- }
-
- }else{
- alert("訂單已關(guān)閉");
- }
-
-
- }
-
- //喚起微信支付
- function pay(){
- 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{
- onBridgeReady();
- }
-
- }
-
- //開始支付
- function onBridgeReady(){
- WeixinJSBridge.invoke(
- 'getBrandWCPayRequest', {
- "appId" : appId, //公眾號名稱,由商戶傳入
- "timeStamp": timeStamp+"", //時(shí)間戳,自1970年以來的秒數(shù)
- "nonceStr" : nonceStr, //隨機(jī)串
- "package" : "prepay_id=" + pg,
- "signType" : signType, //微信簽名方式:
- "paySign" : paySign //微信簽名
- },
-
- function(res){
- if(res.err_msg == "get_brand_wcpay_request:ok" ) {
- alert("支付成功"); // 使用以上方式判斷前端返回,微信團(tuán)隊(duì)鄭重提示:res.err_msg將在用戶支付成功后返回 ok,但并不保證它絕對可靠。
- //回到用戶訂單列表
- window.location.);
- }else{
- //支付失敗
- alert(res.err_msg)
- }
- }
- );
- }
后臺生成預(yù)支付id的關(guān)鍵代碼:
- UnifiedorderResult unifiedorderResult = null;
- //getSumTotal 微信的價(jià)格單位是分(x100),所以intValue 不存在精度丟失的問題
- int total_fee = (trans.getTotal().intValue() - userBonus - userYqh)*100;
- total_fee = 1;//一分錢測試
- unifiedorderResult = WxPay.getWxPayUnifiedResult(body, detail, attach,trans.getId()+CommonUtils.getRandByNum(6), total_fee, spbill_create_ip,loginUser.getThirdLoginWXId());
- String timestamp = String.valueOf(new Date().getTime()/1000);
- String nonceStr = unifiedorderResult.getNonce_str();
- String prepay_id = unifiedorderResult.getPrepay_id();
-
- jsonObject.put("appId", WxConfig.appid);
- jsonObject.put("timeStamp", timestamp);
- jsonObject.put("signType", "MD5");
- jsonObject.put("nonceStr", nonceStr);
- jsonObject.put("package", "prepay_id="+prepay_id);
-
- //參數(shù):開始生成簽名
- SortedMap<Object,Object> parameters = new TreeMap<Object,Object>();
- parameters.put("appId", WxConfig.appid);
- parameters.put("timeStamp", timestamp);
- parameters.put("signType", "MD5");
- parameters.put("nonceStr", nonceStr);
- parameters.put("package", "prepay_id="+prepay_id);
-
- String sign = WXSignUtils.createSign("UTF-8", parameters);
- jsonObject.put("sign", sign);
- jsonObject.put("prepay_id", prepay_id);
-
- writer.write(jsonObject.toString());
- System.out.println("預(yù)支付id相關(guān)參數(shù)是:"+jsonObject.toString());
- if(writer!=null){
- writer.close();
- }
total=1;//1分錢測試,這里設(shè)置了后所有的商品都是1分錢的東西了,切記上線之前要注釋掉!!否則你老板就要叫你去他辦公室聊人生,談理想了~
生成簽名的關(guān)鍵代碼:之前做app支付的時(shí)候貼過源代碼的,現(xiàn)在再貼一次,唯一不同的是,這里簽名一定需要傳openid
- /**
- * 統(tǒng)一下單得到prepay_id(預(yù)支付id)
- * @param body
- * @param detail
- * @param attach
- * @param out_trade_no
- * @param total_fee
- * @param spbill_create_ip
- * @return
- */
- public static UnifiedorderResult getWxPayUnifiedResult(String body,String detail,String attach,String out_trade_no,int total_fee,String spbill_create_ip,String openid){
- try{
- //應(yīng)用APPID【appid】
- String appid = WxConfig.appid;
- //System.out.println("appid是:"+appid);
- //微信支付商戶號【mch_id】
- String mch_id = WxConfig.mch_id;
- //System.out.println("mch_id是:"+mch_id);
- //回調(diào)地址
- String notify_url = WxConfig.notify_url;
- //隨機(jī)字符串
- String nonce_str = RandCharsUtils.getRandomString(16);
- //System.out.println("隨機(jī)字符串是:"+nonce_str);
- //交易起始時(shí)間
- String time_start = RandCharsUtils.timeStart();
- //System.out.println(time_start);
- //交易結(jié)束時(shí)間
- String time_expire = RandCharsUtils.timeExpire();
- //System.out.println(time_expire);
- //交易類型
- String trade_type = "JSAPI";//JSAPI--公眾號支付、NATIVE--原生掃碼支付、APP--app支付,統(tǒng)一下單接口trade_type的傳參可參考這里
-
- //body = "黑色手拿包";
-
- //參數(shù):開始生成簽名
- SortedMap<Object,Object> parameters = new TreeMap<Object,Object>();
- parameters.put("appid", appid);
- parameters.put("mch_id", mch_id);
- parameters.put("nonce_str", nonce_str);
- //body = Utf8EncodeUtils.getUTF8XMLString(body);
- //System.out.println("body是:"+body);
- parameters.put("body", body.toString());
- //detail = Utf8EncodeUtils.getUTF8XMLString(detail);
- //System.out.println("detail是:"+detail);
- parameters.put("detail", detail.toString());
- parameters.put("attach", attach);
- parameters.put("out_trade_no", out_trade_no);
- parameters.put("total_fee", total_fee);
- parameters.put("time_start", time_start);
- parameters.put("time_expire", time_expire);
- parameters.put("notify_url", notify_url);
- parameters.put("trade_type", trade_type);
- parameters.put("spbill_create_ip", spbill_create_ip);
- parameters.put("openid", openid);
-
- //開始簽名
- String sign = WXSignUtils.createSign("UTF-8", parameters);
- System.out.println("簽名是:"+sign);
- log.debug("微信支付簽名:"+sign);
-
- Unifiedorder unifiedorder = new Unifiedorder();
- unifiedorder.setAppid(appid);
- unifiedorder.setMch_id(mch_id);
- unifiedorder.setNonce_str(nonce_str);
- unifiedorder.setSign(sign);
- unifiedorder.setBody(body);
- unifiedorder.setDetail(detail);
- unifiedorder.setAttach(attach);
- unifiedorder.setOut_trade_no(out_trade_no);
- unifiedorder.setTotal_fee(total_fee);
- unifiedorder.setSpbill_create_ip(spbill_create_ip);
- unifiedorder.setTime_start(time_start);
- unifiedorder.setTime_expire(time_expire);
- unifiedorder.setNotify_url(notify_url);
- unifiedorder.setTrade_type(trade_type);
- unifiedorder.setOpenid(openid);
-
- //構(gòu)造xml參數(shù)
- String xmlInfo = HttpXmlUtils.xmlInfo(unifiedorder);
-
- System.out.println(xmlInfo);
-
- String wxUrl = UnifiedorderUrl;
-
- String method = "POST";
-
- String weixinPost = HttpXmlUtils.httpsRequest(wxUrl, method, xmlInfo).toString();
-
- System.out.println(weixinPost);
- log.debug("微信支付返回:"+weixinPost);
-
- return JdomParseXmlUtils.getUnifiedorderResult(weixinPost);
- }catch(Exception ex){
- ex.printStackTrace();
-
- log.debug("微信支付:"+ex.getMessage());
- }
-
- return null;
- }
這里會出現(xiàn)的問題也是一直提醒簽名失敗,我擦,為毛每次都是簽名的問題,煩不煩~~~~
拿到與支付id后再次簽名的時(shí)候由于沒有標(biāo)準(zhǔn)的文檔格式,只能靠自己仔細(xì)讀那陀代碼了
額,到此為止,js支付應(yīng)該沒什么問題了,good luck~
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報(bào)。