免费国产欧美国日产_少妇AV一区二区三区无码_蜜桃精品av无码喷奶水小说_jk18禁网站视频_精产国品一二三级产品区别_被夫の上司に犯波多野结衣_78m成人手机免费看_最爽最刺激18禁视频_偷偷色噜狠狠狠狠的777米奇

易優(yōu)GEO 重磅上線 ~ 一站式GEO優(yōu)化工具,讓豆包、文心一言、DeepSeek 在回答中主動推薦你的品牌,搶占AI流量入口!  點擊查看

小程序模板網(wǎng)

Java 后臺 實現(xiàn)小程序支付

發(fā)布時間:2018-02-09 14:55 所屬欄目:小程序開發(fā)教程


前些天使用 LeanCloud 云引擎寫了個小程序的支付相關(guān) 以前只做過 APP 支付,這次在小程序支付爬了兩天的坑 把代碼也分享出來。

支付流程: 
1.小程序前端獲取微信 openId 以及訂單號 傳給后臺 
2,后臺根據(jù) openId 和訂單號進(jìn)行簽名 post 微信統(tǒng)一下單接口 
3.后臺獲取微信返回的xml字符串 解析 二次簽名以后返回給前端 
4.前端調(diào)起支付微信支付 API

先看支付函數(shù):

 

  1. //獲取支付信息
    @EngineFunction("getPayInformation")
    public static Map<String, Object> getPayInformation(
    @EngineFunctionParam("orderId") String orderId
    ) throws AVException, UnsupportedEncodingException, DocumentException {
    Map<String, Object> reqMap = new TreeMap<String, Object>(
    new Comparator<String>() {
    public int compare(String obj1, String obj2) {
    // 升序排序
    return obj1.compareTo(obj2);
    }
    });
    if (AVUser.getCurrentUser() != null) {
    String authDataJson = JSONArray.toJSONString(AVUser.getCurrentUser().get("authData"));
    JSONObject jsonObject = JSON.parseObject(authDataJson);
    jsonObject.get("lc_weapp");
    JSONObject j2 = JSON.parseObject(jsonObject.get("lc_weapp").toString());
    String openId = (String) j2.get("openid");
    
    AVQuery<Order> query = AVObject.getQuery(Order.class);
    Order order = query.get(orderId);
    reqMap.put("appid", System.getenv("appid"));
    reqMap.put("mch_id", System.getenv("mch_id"));
    reqMap.put("nonce_str", WXPayUtil.getNonce_str());
    reqMap.put("body", new String(order.getDishesList().toString().getBytes("UTF-8")));
    reqMap.put("openid", openId);
    reqMap.put("out_trade_no", order.getObjectId());
    reqMap.put("total_fee", 1); //訂單總金額,單位為分
    reqMap.put("spbill_create_ip", "192.168.0.1"); //用戶端ip
    reqMap.put("notify_url", System.getenv("notify_url")); //通知地址
    reqMap.put("trade_type", System.getenv("trade_type")); //trade_type=JSAPI時(即公眾號支付),此參數(shù)必傳,此參數(shù)為微信用戶在商戶對應(yīng)appid下的唯一標(biāo)識
    String reqStr = WXPayUtil.map2Xml(reqMap);
    String resultXml = HttpRequest.sendPost(reqStr);
    System.out.println("微信請求返回:" + resultXml);
    //解析微信返回串 如果狀態(tài)成功 則返回給前端
    if (WXPayUtil.getReturnCode(resultXml) != null && WXPayUtil.getReturnCode(resultXml).equals("SUCCESS")) {
    //成功
    Map<String, Object> resultMap = new TreeMap<>(
    new Comparator<String>() {
    public int compare(String obj1, String obj2) {
    // 升序排序
    return obj1.compareTo(obj2);
    }
    });
    resultMap.put("appId", System.getenv("appid"));
    resultMap.put("nonceStr", WXPayUtil.getNonceStr(resultXml));//解析隨機字符串
    resultMap.put("package", "prepay_id=" + WXPayUtil.getPrepayId(resultXml));
    resultMap.put("signType", "MD5");
    resultMap.put("timeStamp", String.valueOf((System.currentTimeMillis() / 1000)));//時間戳
    String paySign = WXPayUtil.getSign(resultMap);
    resultMap.put("paySign", paySign);
    return resultMap;
    } else {
    throw new AVException(999, "微信請求支付失敗");
    }
    } else {
    throw new AVException(98, "當(dāng)前未登錄用戶");
    }
    }

其中appid和mch_id可以用系統(tǒng)常量  PS:這里注意一個坑  二次簽名的時候使用 appId nonceStr package signType timeStamp 這五個key生成簽名(這里無視微信官方文檔 以及注意 appId 的大小寫)  前端調(diào)起API支付時 按照官方文檔就可以

網(wǎng)絡(luò)請求類:  HttpRequest

 

  1. import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.URL;
    import java.net.URLConnection;
    import java.util.List;
    import java.util.Map;
    
    public class HttpRequest {
    /**
    * 向指定URL發(fā)送GET方法的請求
    *
    * @param url 發(fā)送請求的URL
    * @param param 請求參數(shù),請求參數(shù)應(yīng)該是 name1=value1&name2=value2 的形式。
    * @return URL 所代表遠(yuǎn)程資源的響應(yīng)結(jié)果
    */
    public static String sendGet(String url, String param) {
    String result = "";
    BufferedReader in = null
    


易優(yōu)小程序(企業(yè)版)+靈活api+前后代碼開源 碼云倉庫:starfork
本文地址:http://m.szcjxy.com/wxmini/doc/course/21886.html 復(fù)制鏈接 如需定制請聯(lián)系易優(yōu)客服咨詢: 點擊咨詢
在線客服