用户
 找回密码
 立即注册

QQ登录

只需一步,快速开始

微客吧 首页 教程 微信小程序 新手教程 查看内容

Java 后台 实现小程序支付

纸飞机 2018-3-6 16:10

作者:Alex富贵 ,来自原文地址 前些天使用 LeanCloud 云引擎写了个的支付相关 以前只做过 APP 支付,这次在小程序支付爬了两天的坑 把代码也分享出来。支付流程: 1.小程序前端获取微信 openId 以及订单号 传给后台 ...

作者:Alex富贵 ,来自

原文地址


前些天使用 LeanCloud 云引擎写了个的支付相关 以前只做过 APP 支付,这次在小程序支付爬了两天的坑 把代码也分享出来。

支付流程:
1.小程序前端获取微信 openId 以及订单号 传给后台
2,后台根据 openId 和订单号进行签名 post 微信统一下单接口
3.后台获取微信返回的xml字符串 解析 二次签名以后返回给前端
4.前端调起支付微信支付 API

先看支付函数:

  1. //获取支付信息
  2. @EngineFunction("getPayInformation")
  3. public static Map<String, Object> getPayInformation(
  4. @EngineFunctionParam("orderId") String orderId
  5. ) throws AVException, UnsupportedEncodingException, DocumentException {
  6. Map<String, Object> reqMap = new TreeMap<String, Object>(
  7. new Comparator<String>() {
  8. public int compare(String obj1, String obj2) {
  9. // 升序排序
  10. return obj1.compareTo(obj2);
  11. }
  12. });
  13. if (AVUser.getCurrentUser() != null) {
  14. String authDataJson = JSONArray.toJSONString(AVUser.getCurrentUser().get("authData"));
  15. JSONObject jsonObject = JSON.parseObject(authDataJson);
  16. jsonObject.get("lc_weapp");
  17. JSONObject j2 = JSON.parseObject(jsonObject.get("lc_weapp").toString());
  18. String openId = (String) j2.get("openid");
  19. AVQuery<Order> query = AVObject.getQuery(Order.class);
  20. Order order = query.get(orderId);
  21. reqMap.put("appid", System.getenv("appid"));
  22. reqMap.put("mch_id", System.getenv("mch_id"));
  23. reqMap.put("nonce_str", WXPayUtil.getNonce_str());
  24. reqMap.put("body", new String(order.getDishesList().toString().getBytes("UTF-8")));
  25. reqMap.put("openid", openId);
  26. reqMap.put("out_trade_no", order.getObjectId());
  27. reqMap.put("total_fee", 1); //订单总金额,单位为分
  28. reqMap.put("spbill_create_ip", "192.168.0.1"); //用户端ip
  29. reqMap.put("notify_url", System.getenv("notify_url")); //通知地址
  30. reqMap.put("trade_type", System.getenv("trade_type")); //trade_type=JSAPI时(即公众号支付),此参数必传,此参数为微信用户在商户对应appid下的唯一标识
  31. String reqStr = WXPayUtil.map2Xml(reqMap);
  32. String resultXml = HttpRequest.sendPost(reqStr);
  33. System.out.println("微信请求返回:" + resultXml);
  34. //解析微信返回串 如果状态成功 则返回给前端
  35. if (WXPayUtil.getReturnCode(resultXml) != null && WXPayUtil.getReturnCode(resultXml).equals("SUCCESS")) {
  36. //成功
  37. Map<String, Object> resultMap = new TreeMap<>(
  38. new Comparator<String>() {
  39. public int compare(String obj1, String obj2) {
  40. // 升序排序
  41. return obj1.compareTo(obj2);
  42. }
  43. });
  44. resultMap.put("appId", System.getenv("appid"));
  45. resultMap.put("nonceStr", WXPayUtil.getNonceStr(resultXml));//解析随机字符串
  46. resultMap.put("package", "prepay_id=" + WXPayUtil.getPrepayId(resultXml));
  47. resultMap.put("signType", "MD5");
  48. resultMap.put("timeStamp", String.valueOf((System.currentTimeMillis() / 1000)));//时间戳
  49. String paySign = WXPayUtil.getSign(resultMap);
  50. resultMap.put("paySign", paySign);
  51. return resultMap;
  52. } else {
  53. throw new AVException(999, "微信请求支付失败");
  54. }
  55. } else {
  56. throw new AVException(98, "当前未登录用户");
  57. }
  58. }

其中appid和mch_id可以用系统常量
PS:这里注意一个坑
二次签名的时候使用 appId nonceStr package signType timeStamp 这五个key生成签名(这里无视微信官方文档 以及注意 appId 的大小写)
前端调起API支付时 按照官方文档就可以

网络请求类:
HttpRequest

  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.io.PrintWriter;
  5. import java.net.URL;
  6. import java.net.URLConnection;
  7. import java.util.List;
  8. import java.util.Map;
  9. public class HttpRequest {
  10. /**
  11. * 向指定URL发送GET方法的请求
  12. *
  13. * @param url 发送请求的URL
  14. * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
  15. * @return URL 所代表远程资源的响应结果
  16. */
  17. public static String sendGet(String url, String param) {
  18. String result = "";
  19. BufferedReader in = null
鲜花
鲜花
握手
握手
雷人
雷人
路过
路过
鸡蛋
鸡蛋
分享至 : QQ空间
收藏