先簡單說下微信公衆號支付的流程首先得到code,而後得到openid,而後根據openid獲取到預支付ID(prepay_id),獲取到prepay_id,天然獲得packages ,這個最難得到的參數得到以後,基本上就作好一半了,剩餘的參數 appId 公衆號id,timeStamp時間戳,nonceStr隨機字符串,signType簽名方式,paySign。html
獲取到這些參數後,新建一個頁面,複製微信的代碼 :前端
function onBridgeReady(){ WeixinJSBridge.invoke( 'getBrandWCPayRequest', { "appId" : "wx2421b1c4370ec43b", //公衆號名稱,由商戶傳入 "timeStamp":" 1395712654", //時間戳,自1970年以來的秒數 "nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //隨機串 "package" : "prepay_id=u802345jgfjsdfgsdg888", "signType" : "MD5", //微信簽名方式: "paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信簽名 }, function(res){ if(res.err_msg == "get_brand_wcpay_request:ok" ) {} // 使用 以上方式判斷前端返回,微信團隊鄭重提示:res.err_msg將在用戶支付成功後返回 ok,但並不保證它絕對可靠。 } ); } 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(); }
聲明:以上代碼爲微信官方文檔中,如使用,請到官方文檔中複製api
這樣微信就會自動調用支付安全
一、調用微信支付一閃而過微信
微信的測試路徑不對,進入公衆號平臺,檢查測試路徑,app
若是使用的是測試路徑,則必須將本身的公衆號加入到測試白名單中微信公衆平臺
二、微信支付所需參數dom
appid 微信公衆平臺中的 基本配置中函數
appsecret 微信公衆平臺中的 基本配置中測試
partner 商戶號
key 在商戶平臺下的帳戶設置api安全中。
三、在微信支付頁面最好只要一些必要的東西,若是多了,可能會引發衝突。
四、開發前須要修改接口權限下的網頁受權基本信息,填寫測試的域名
五、微信支付調不起來緣由
帶有網頁嵌套的調用不起來
有多是jq版本問題,調用低版本試試
六、調用微信支付另外方法
wx.chooseWXPay({
timestamp: 0, // 支付簽名時間戳,注意微信jssdk中的全部使用timestamp字段均爲小寫。但最新版的支付後臺生成簽名使用的timeStamp字段名需大寫其中的S字符
nonceStr: '', // 支付簽名隨機串,不長於 32 位
package: '', // 統一支付接口返回的prepay_id參數值,提交格式如:prepay_id=***)
signType: '', // 簽名方式,默認爲'SHA1',使用新版支付需傳入'MD5'
paySign: '', // 支付簽名
success: function (res) {
// 支付成功後的回調函數
}
});
參考
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang=zh_CN
七、錯誤解決方案,連接
http://kf.qq.com/faq/140225MveaUz150413VNj6nm.html
八、最近遇到一個問題,就是網頁支付一閃而過,蘋果的手機能夠支付,安卓的手機不能夠支付,通過調試,發現安卓手機發起的支付都獲取到了兩個Ip地址,這樣取出其中一個Ip地址便可解決問題
2016-01-22
微信支付用到的方法
/** * 元轉換成分 * @param money * @return */ public static String getMoney(String amount) { if(amount==null){ return ""; } // 金額轉化爲分爲單位 String currency = amount.replaceAll("\\$|\\¥|\\,", ""); //處理包含, ¥ 或者$的金額 int index = currency.indexOf("."); int length = 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"); } return amLong.toString(); } public String getIpAddr(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip; }
/** * 獲取隨機字符串 * @return */ public static String getNonceStr() { // 隨機數 String currTime = TenpayUtil.getCurrTime(); // 8位日期 String strTime = currTime.substring(8, currTime.length()); // 四位隨機數 String strRandom = TenpayUtil.buildRandom(4) + ""; // 10位序列號,能夠自行調整。 return strTime + strRandom; }
//獲取ip地址 public String getIpAddr(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip; }