小程序最近火了,所以我也花點時間研究了下,同時自己也練練手做了一個小程序“商務(wù)工作記事冊”,在微信小程序里可以被搜索到,接下去我講講我開發(fā)過程中遇到的一些坑吧,主要針對后臺。
主要功能:
-
支付接口調(diào)測:點擊支持我們,可以直接捐贈;
-
提醒功能:主要使用客服通知以及微信小卡片通知;
-
自定義賬本字段:主要就各種Event的Tag可以擴展字段;
-
文件上傳下載:支持事件上傳圖片,錄音文件;
首先要做到上面這些,后臺必須要從小程序平臺得到的信息如下圖:
準(zhǔn)備工作就緒,講講我開發(fā)這個小程序遇到的一些問題以及相應(yīng)實現(xiàn)吧
前端問題
-
高度不能用rpx,不然無法計算以及自適應(yīng),所以我后來改成了px,不知道有沒有更好的方案;
-
首頁應(yīng)該要驗證token合法性,要去服務(wù)器請求驗證,這個過程是異步的,所以在載入首頁之前應(yīng)該有個splash過渡窗口引導(dǎo),不然進(jìn)入首頁token非法的就將無法請求到數(shù)據(jù),不知道有沒有更好的方案;
-
排版布局使用的是weui,不知道還有沒有更好的wxss可以使用;
-
由于異步調(diào)用多會亂,所以后來引入的Promise,好很多;
后臺問題
支付實現(xiàn);
支付微信為了安全性,增加了數(shù)字簽名,首先你要發(fā)起一個訂單,得到訂單號,有了這個訂單號,就可以啟動微信支付功能了,以下是代碼:
-
public JSONObject prePay() throws Exception{
-
UserBean ub = getWxUser();
-
if(ub!=null){
-
String appid = (StrUtil.formatNullStr(TagConst.globalMap.get("wx.appid")));
-
String appkey = (StrUtil.formatNullStr(TagConst.globalMap.get("wx.seckey")));
-
String mch_id = (StrUtil.formatNullStr(TagConst.globalMap.get("wx.mchid")));
-
String mchkey = (StrUtil.formatNullStr(TagConst.globalMap.get("wx.mchkey")));
-
-
String openId = ub.getUid();
-
String clientIP = HttpUtils.getIP(request);
-
if(clientIP.indexOf(":")>0) clientIP = "127.0.0.1";
-
-
String fee = StrUtil.formatNullStr(request.getParameter("fee"),"1");
-
String body = StrUtil.formatNullStr(request.getParameter("body"));
-
String atta = StrUtil.formatNullStr(request.getParameter("atta"));
-
-
String nonce_str = UUIDHexGenerator.generate();
-
String today = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
-
String code = PayUtil.createCode(8);
-
String out_trade_no = mch_id+today+code;//商戶訂單號
-
String spbill_create_ip = clientIP;//終端IP
-
String trade_type = "JSAPI";//交易類型
-
String openid=openId;//用戶標(biāo)識
-
/**/
-
PayInfo paymentPo = new PayInfo();
-
paymentPo.setAppid(appid);
-
paymentPo.setMch_id(mch_id);
-
paymentPo.setNonce_str(nonce_str);
-
paymentPo.setBody(body);
-
paymentPo.setOut_trade_no(out_trade_no);
-
paymentPo.setTotal_fee(fee);
-
paymentPo.setSpbill_create_ip(spbill_create_ip);
-
paymentPo.setNotify_url(URL_NOTIFY);
-
paymentPo.setTrade_type(trade_type);
-
paymentPo.setOpenid(openid);
-
// 把請求參數(shù)打包成數(shù)組
-
Map<String, String> sParaTemp = new HashMap<String, String>();
-
sParaTemp.put("appid", paymentPo.getAppid());
-
sParaTemp.put("mch_id", paymentPo.getMch_id());
-
sParaTemp.put("nonce_str", paymentPo.getNonce_str());
-
sParaTemp.put("body", paymentPo.getBody());
-
sParaTemp.put("out_trade_no", paymentPo.getOut_trade_no());
-
sParaTemp.put("total_fee",paymentPo.getTotal_fee());
-
sParaTemp.put("spbill_create_ip", paymentPo.getSpbill_create_ip());
-
sParaTemp.put("notify_url",paymentPo.getNotify_url());
-
sParaTemp.put("trade_type", paymentPo.getTrade_type());
-
sParaTemp.put("openid", paymentPo.getOpenid());
-
// 除去數(shù)組中的空值和簽名參數(shù)
-
Map<String, String> sPara = PayUtil.paraFilter(sParaTemp);
-
String prestr = PayUtil.createLinkString(sPara); // 把數(shù)組所有元素,按照“參數(shù)=參數(shù)值”的模式用“&”字符拼接成字符串
-
String key = "&key="+mchkey; // 商戶支付密鑰
-
//MD5運算生成簽名
-
String mysign = PayUtil.sign(prestr, key, "utf-8").toUpperCase();
-
paymentPo.setSign(mysign);
-
String respXml = MessageUtil.messageToXML(paymentPo);
-
respXml = respXml.replace("__", "_");
-
String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
-
String param = respXml;
-
String result =PayUtil.httpRequest(url, "POST", param);
-
Map<String, String> map = new HashMap<String, String>();
-
InputStream in=new ByteArrayInputStream(result.getBytes());
-