微信、支付寶支付那點事
公司要在MUI開發的APP裡新增上支付功能,然後爬坑開始了。。
因為公司用的是Java語言開發的服務端,所以就要找Java版本的支付程式碼了
首先在dcloud的問答裡搜尋看有沒有相關文章,找到了下面兩篇有用的
第一篇是配置支付寶支付的,第二篇是我在下面發了一個回覆求微信支付的程式碼(所以程式碼在回覆裡)
dcloud官方給的php程式碼地址:https://github.com/dcloudio/H5P.Server
下面說說我在爬坑的時候碰到的障礙
1. Java語言輸出方法有print(),println() 切記一定不能用println() 這個方法輸出後會換行,所以一直是失敗狀態,我開發的時候是支付寶報的錯ALI10
2. 微信支付,從APP裡請求到服務端介面,在介面裡會呼叫一次微信的介面,此時涉及到一次簽名(sign),切記在簽名前傳送給微信伺服器的引數要按照a-z排列好,然後在去簽名,完成之後請求微信支付介面,微信給返回一些XML資料,其中只有prepay_id有用,其他需要的引數基本上都是在微信的配置類裡配置好了的,此時轉換成的json格式資料寫出的還有一次簽名(sign),這個簽名跟上面第一次的簽名不一樣,要記得在簽名引數最後帶上key
3. 支付寶支付的引數,地址類的字串比如:notify_url等,不需要URLEncoder.encode(),引數都要加上""
4. xcode裡,如果APP跳轉到支付寶開啟的是網頁版的,而不是支付寶APP,就需要在xcode裡配置plist檔案新增下面這些程式碼
<key>LSApplicationQueriesSchemes</key><array><string>weixin</string><string>wechat</string><string>alipay</string><string>sinaweibo</string><string>weibosdk</string><string>tencentweiboSdkv2</string><string>weibosdk2.5</string><string>mqq</string><string>mqqOpensdkSSoLogin</string><string>mqqopensdkapiV2</string><string>mqqwpa</string><string>mqqopensdkapiV3</string><string>wtloginmqq2</string></array>
下面是我Java服務端的程式碼,給大家分享一下
支付寶(使用了支付寶商戶SDK)
publicvoid alipayapi(HttpServletRequest request,HttpServletResponse response)throwsException{
response.setContentType("text/plain; charset=UTF-8");PrintWriterout= response.getWriter();////////////////////////////////////請求引數////////////////////////////////////////支付型別String payment_type ="1";//必填,不能修改//伺服器非同步通知頁面路徑String notify_url =ApplicationListener.getBasePath()+"pay/sdk/alipay/notify";//需http://格式的完整路徑,不能加?id=123這類自定義引數//頁面跳轉同步通知頁面路徑// String return_url = URLEncoder.encode(ApplicationListener.getBasePath() + "pay/wap/alipay/return");//需http://格式的完整路徑,不能加?id=123這類自定義引數,不能寫成http://localhost///商戶訂單號String out_trade_no = request.getParameter("orderId");//商戶網站訂單系統中唯一訂單號,必填//訂單名稱String subject ="支付預定金";//必填//付款金額String total_fee = request.getParameter("total_fee");//必填//商品展示地址String show_url =ApplicationListener.getBasePath();//必填,需以http://開頭的完整路徑,例如:http://www.商戶網址.com/myorder.html//訂單描述String body ="訂單支付定金";//選填//超時時間String it_b_pay ="1d";//選填//把請求引數打包成陣列Map<String,String> sParaTemp =newHashMap<String,String>();
sParaTemp.put("service","mobile.securitypay.pay");
sParaTemp.put("partner",AlipayConfig.partner);
sParaTemp.put("seller_id",AlipayConfig.seller_id);
sParaTemp.put("_input_charset",AlipayConfig.input_charset);
sParaTemp.put("payment_type", payment_type);
sParaTemp.put("notify_url", notify_url);
sParaTemp.put("out_trade_no", out_trade_no);
sParaTemp.put("subject", subject);
sParaTemp.put("total_fee", total_fee);
sParaTemp.put("show_url", show_url);
sParaTemp.put("body", body);
sParaTemp.put("it_b_pay", it_b_pay);String sHtmlText ="";for(Iterator iter = sParaTemp.keySet().iterator(); iter.hasNext();){String name =(String) iter.next();String value = sParaTemp.get(name);
sHtmlText += name +"=\""+ value +"\"&";}//建立請求System.out.println(sHtmlText);
sHtmlText = sHtmlText.substring(0, sHtmlText.length()-1);String sign = RSA.sign(sHtmlText,AlipayConfig.PRIVATE,AlipayConfig.input_charset);String outText = sHtmlText +"&sign=\""+URLEncoder.encode(sign,"UTF-8")+"\"&sign_type=\""+AlipayConfig.sign_type+"\"";out.print(outText);}
微信支付(用到了微信Java版SDK,下載地址)
RequestData.java
publicclassRequestData{privateString appid;privateString body;privateString mch_id;privateString nonce_str;privateString notify_url;privateString out_trade_no;privateString sign;privateString spbill_create_ip;privateString total_fee;privateString trade_type;//getter,setter}
publicvoid alipayapi(HttpServletRequest request,HttpServletResponse response)throwsException{
response.setContentType("text/plain; charset=UTF-8");PrintWriterout= response.getWriter();//微信分配的公眾賬號ID(企業號corpid即為此appId)String appid =Configure.getAppid();//必填//商品或支付單簡要描述String body ="預定金支付";//必填//微信支付分配的商戶號String mch_id =Configure.getMchid();//必填//隨機字串,不長於32位。推薦隨機數生成演算法String nonce_str =RandomStringGenerator.getRandomStringByLength(32);//必填//接收微信支付非同步通知回撥地址String notify_url =ApplicationListener.getBasePath()+"pay/sdk/wxpay/notify";//必填//商戶系統內部的訂單號,32個字元內、可包含字母, 其他說明見商戶訂單號String out_trade_no = request.getParameter("orderId");//必填//簽名,詳見簽名生成演算法String sign ="";//必填//APP和網頁支付提交使用者端ip,Native支付填呼叫微信支付API的機器IP。String spbill_create_ip =IpUtil.getIpAddr(request);//必填//訂單總金額,單位為分,詳見支付金額Double total_fee_d =Double.parseDouble(request.getParameter("total_fee"));Double total_fee_s = total_fee_d *100;String total_fee = total_fee_s.intValue()+"";//必填//取值如下:JSAPI,NATIVE,APP,詳細說明見引數規定String trade_type = request.getParameter("trade_type");//必填//=============================以下引數 非必填 ===============================//商品名稱明細列表String detail ="";//非必填//附加資料,在查詢API和支付通知中原樣返回,該欄位主要用於商戶攜帶訂單的自定義資料String attach ="";//非必填//符合ISO 4217標準的三位字母程式碼,預設人民幣:CNY,其他值列表詳見貨幣型別String fee_type ="";//非必填//終端裝置號(門店號或收銀裝置ID),注意:PC網頁或公眾號內支付請傳"WEB"String device_info ="";//非必填//商品標記,代金券或立減優惠功能的引數,說明詳見代金券或立減優惠String goods_tag ="";//非必填//訂單生成時間,格式為yyyyMMddHHmmss,如2009年12月25日9點10分10秒錶示為20091225091010。其他詳見時間規則String time_start ="";//非必填//訂單失效時間,格式為yyyyMMddHHmmss,如2009年12月27日9點10分10秒錶示為20091227091010。其他詳見時間規則//注意:最短失效時間間隔必須大於5分鐘String time_expire ="";//非必填//trade_type=NATIVE,此引數必傳。此id為二維碼中包含的商品ID,商戶自行定義。String product_id ="";//非必填//no_credit--指定不能使用信用卡支付String limit_pay ="";//非必填//trade_type=JSAPI,此引數必傳,使用者在商戶appid下的唯一標識。openid如何獲取,可參考【獲取openid】。//企業號請使用【企業號OAuth2.0介面】獲取企業號內成員userid,再呼叫【企業號userid轉openid介面】進行轉換String openid ="";//非必填RequestData reqData =newRequestData();
reqData.setAppid(appid);
reqData.setBody(body);
reqData.setMch_id(mch_id);
reqData.setNonce_str(nonce_str);
reqData.setNotify_url(notify_url);
reqData.setOut_trade_no(out_trade_no);
reqData.setSpbill_create_ip(spbill_create_ip);
reqData.setTotal_fee(total_fee);
reqData.setTrade_type(trade_type);
sign =Signature.getSign(reqData);
reqData.setSign(sign);String result =newHttpsRequest().sendPost("https://api.mch.weixin.qq.com/pay/unifiedorder", reqData);System.out.println(result);Map map =XMLParser.getMapFromXML(result);String prepay_id =(String) map.get("prepay_id");System.out.println(prepay_id);String timestamp =String.valueOf(System.currentTimeMillis()/1000);String s="appid="+appid+"&noncestr="+nonce_str+"&package=Sign=WXPay"+"&partnerid="+
mch_id+"&prepayid="+prepay_id+"×tamp="+timestamp+"&key="+Configure.getKey();String newSign = MD5.MD5Encode(s).toUpperCase();StringBuffer json =newStringBuffer();
json.append("{\"appid\":\"");
json.append(appid);
json.append("\",\"noncestr\":\"");
json.append(nonce_str);
json.append("\",\"package\":\"");
json.append("Sign=WXPay");
json.append("\",\"partnerid\":\"");
json.append(mch_id);
json.append("\",\"prepayid\":\"");
json.append(prepay_id);
json.append("\",\"timestamp\":\"");
json.append(timestamp);
json.append("\",\"sign\":\"");
json.append(newSign);
json.append("\"}");System.out.println(json.toString());out.print(json.toString());}