​前一篇文章的时序图中说了,app端调用微信支付必须先由后台调用微信后台生成预付单,再构建参数给手机端,而数据的构建要以xml形式,那么看看代码具体实现吧,代码已经精简过了,自己的业务已经除去,精简的代码附上注释是可以直接调用微信后台的

这个是微信所要接受的参数,咱们可以把它构建成一个entity

public class WXPrepay {private static String unifiedorder = "https://api.mch.weixin.qq.com/pay/unifiedorder";private static String orderquery = "https://api.mch.weixin.qq.com/pay/orderquery";private String appid;                // 应用ID            微信开放平台审核通过的应用APPIDprivate String mch_id;                // 商户号            微信支付分配的商户号private String nonce_str = OrderUtil.CreateNoncestr();        // 随机字符串        随机字符串,不长于32位private String sign;                // 签名        private String body;                // 商品描述        商品描述交易字段格式根据不同的应用场景按照以下格式:APP——需传入应用市场上的APP名字-实际商品名称,天天爱消除-游戏充值。private String out_trade_no;        // 商户订单号        商户系统内部的订单号,32个字符内、可包含字母private String total_fee;            // 总金额            订单总金额,单位为分private String spbill_create_ip;    // 终端IP            用户端实际ipprivate String notify_url;            // 通知地址        接收微信支付异步通知回调地址,通知url必须为直接可访问的url,不能携带参数。    private String trade_type;            // 交易类型        支付类型private String partnerKey;private String attach;                // 附加数据        附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据private String prepay_id;            // 预支付订单号

controller作为一个restful接口供手机端调用,这个接口可以被ios,安卓等调用,只要微信提供了相应手机端的sdk,那就没有问题

@RequestMapping("/wxpay")@ResponseBodypublic LeeJSONResult wxpay(HttpServletRequest request, Model model) {try {// TODO 根据你的业务逻辑计算你需要支付的订单总额double totalFee = 1;// 生成交易流水,流水id需要传给微信,这个流水ID可以作为你的订单ID,由于我们的业务是多订单的,流水ID仅仅只是作为表关联// 需要保存货源id,需要的车辆数,订单id在通知成功后保存String payFlowId = sid.nextShort();SpPayFlowCargoSource payFlowCargoSource = new SpPayFlowCargoSource();payFlowCargoSource.setId(payFlowId);payFlowCargoSource.setFee(new BigDecimal(totalFee));payFlowCargoSource.setPayStatus(PayStatusEnum.NOT_PAID.value);    // 支付状态:未支付// 构建微信参数String spbill_create_ip = request.getRemoteAddr();        // 用户IPWXPrepay prePay = new WXPrepay();prePay.setAppid(WXPayContants.appId);                    prePay.setMch_id(WXPayContants.partnerId);prePay.setBody("demo - 微信支付");                    prePay.setOut_trade_no(payFlowId);                        // 这里要注意,微信支付是以分为单位,而系统是以元为单位,所以需要金额转换。题外话:曾经看到过京东和苏宁都有类似的bug,就是一个台手机和耳机都是要十几元,估计是金额转换出的问题prePay.setTotal_fee(String.valueOf(new BigDecimal(totalFee).multiply(new BigDecimal(100)).intValue()));
//            prePay.setTotal_fee("1");
            prePay.setSpbill_create_ip(spbill_create_ip);prePay.setNotify_url(notifyUrl);                    // 异步通知,这个下篇文章讲prePay.setTrade_type("APP");prePay.setAttach(payFlowId);                        // 存入交易流水id
                prePay.setPartnerKey(WXPayContants.partnerKey);// 获取预支付订单号String prepayId = prePay.submitXmlGetPrepayId();logger.info("获取的预支付订单是:" + prepayId);if (prepayId != null && prepayId.length() > 10) {// 生成微信支付参数,此处拼接为完整的JSON格式,符合支付调起传入格式String jsParam = WXPay.createPackageValue(WXPayContants.appId, WXPayContants.partnerKey, prepayId);System.out.println("jsParam=" + jsParam);// 此处可以添加订单的处理逻辑model.addAttribute("jsParam", jsParam);logger.info("生成的微信调起JS参数为:" + jsParam);payFlowCargoSource.setPrepayId(prepayId);                            spPayFlowCargoSourceService.savePayFlow(payFlowCargoSource);return LeeJSONResult.ok();} else {return LeeJSONResult.errorMsg("微信支付接口调用失败");}} catch (Exception e) {e.printStackTrace();return LeeJSONResult.errorException(e.getMessage());}}

需要注意的是,微信后台接受的参数都是xml格式的,所以咱们的bean需要转换为xml再传给微信,最后调用成功,微信会封装一个xml传过来,咱们同样再解析一下获取预付单号就OK了

public String submitXmlGetPrepayId() {// 创建HttpClientBuilderHttpClientBuilder httpClientBuilder = HttpClientBuilder.create();// HttpClientCloseableHttpClient closeableHttpClient = httpClientBuilder.build();HttpPost httpPost = new HttpPost(unifiedorder);String xml = getPackage();StringEntity entity;try {entity = new StringEntity(xml, "utf-8");httpPost.setEntity(entity);HttpResponse httpResponse;// post请求httpResponse = closeableHttpClient.execute(httpPost);HttpEntity httpEntity = httpResponse.getEntity();if (httpEntity != null) {// 打印响应内容String result = EntityUtils.toString(httpEntity, "UTF-8");System.out.println(result);// 过滤result = result.replaceAll("<![CDATA[|]]>", "");String prepay_id = Jsoup.parse(result).select("prepay_id").html();this.prepay_id = prepay_id;if (prepay_id != null) {return prepay_id;}}// 释放资源
            closeableHttpClient.close();} catch (Exception e) {e.printStackTrace();}return prepay_id;}

其实不用这样的方式也行,把bean通过json的方式封装,最后让它自动转为xml,也是没有问题的,或者直接使用 restful webservice标准协议来接受xml和发送xml

app端微信支付(二) - 生成预付单相关推荐

  1. 微信境外支付php_PHP实现 APP端微信支付功能

    前面已经写了手机APP支付宝支付,今天再把手机APP微信支付补上,前期的准备工作在这里就不多说了,可以参考微信支付开发文档,一定要仔细阅读开发文档,可以让你少踩点坑:准备工作完成后就是配置参数,调用统 ...

  2. 用PHP开发APP端微信支付

    用PHP开发APP端微信支付的一点个人心得 最近因为公司需求,要开发APP端上的微信支付,看了微信文档,感觉还不错,没有遇到太大的坑,需要注意的点不算太多. 写一个记事文档,作为备忘录. APP支付流 ...

  3. php微信app支付教程,PHP APP端微信支付的方法

    这篇文章主要介绍了关于PHP APP端微信支付的方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 前面已经写了手机APP支付宝支付,今天再把手机APP微信支付补上,前期的准备工作在这 ...

  4. uni-app app 端 微信支付

    uni-app微信支付 失败  掉不起来 1,检查 appid 是否 一致 2. 微信端 是对象形式   支付宝 是字符串 3.微信端对象形式 所以 对象属性 小写   packageValue  改 ...

  5. uni-app app平台微信支付

    一.App平台支付流程 流程:支付平台功能申请 -> manifest.json 里配置支付参数 -> uni-app 里调用 API 进行支付 二.微信App支付功能申请 到 微信开放平 ...

  6. 微信支付:支付流程分析、微信扫码支付(HttpClient)、微信支付二维码生成、检测支付状态、订单状态操作准备工作、支付信息回调、MQ处理支付回调状态、定时处理订单状态

    微信支付 微信支付开发的整体思路 生成支付二维码 查询支付状态(微信的服务器) 实现订单状态的修改.删除订单 支付状态回查->微信服务器将支付状态返回给支付微服务 MQ处理支付回调状态 Rabb ...

  7. Java利用HttpClient发送请求生成微信支付二维码、查询支付状态

    一.HttpClient工具类 import org.apache.http.Consts; import org.apache.http.HttpEntity; import org.apache. ...

  8. 用qrcode生成微信支付二维码

    项目场景: 用qrcode生成微信支付二维码 问题描述 根据后台返回的路径动态生成微信二维码 在这里我们用的是qrcodejs2,它有官网文档 npm i qrcodejs2 导入: import Q ...

  9. 9月4日科技资讯|微信支付二维码被诉侵权;AI 换脸 App「ZAO」致歉; Android 10 正式发布

    「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有料的新闻资讯,让所有技术人,时刻紧跟业界潮流. 整理 | 胡 ...

最新文章

  1. OpenCV | OpenCV将图像转换成黑白图像(二进制)
  2. C#-Home / 详解Asp.Net Sql数据库连接字符串
  3. 聊聊JVM(六)理解JVM的safepoint
  4. 在bootstrap table中使用Tooltip
  5. java 随机生成图,Java中的快速实值随机生成器
  6. 关于 CSS will-change 属性你需要知道的事
  7. 护网杯 task_shoppingCart 记录
  8. Java编程的逻辑 (70) - 原子变量和CAS
  9. 学硕论文选题计算机,研究生计算机论文题目大全 研究生计算机论文题目哪个好...
  10. 等保测评所需postgresql数据库命令以及内容解析
  11. 动手实践感受下企业微信的网页授权登录、扫码授权登录
  12. “esxcli software vib” commands to patch an ESXi 5.x/6.x host (2008939)
  13. Android WebView 选择图片并上传(调用相机拍照/相册/选择文件)
  14. 学校计算机信息固定资产编号,学校固定资产的分类和编号(仅供参考).doc
  15. 一款手机电脑都能用的进销存财务软件
  16. android 解锁mac,论一台笔记本三个不同系统的玩法,解锁正确姿势
  17. java调用windowsAPI初识-简单的文件删除功能
  18. 纷享销客CRM自定义函数:计划任务
  19. load 与 loadLibrary
  20. MYsql 性能监控工具

热门文章

  1. TensorFlow: Could not load requested Qt binding.
  2. ROS:Nvidia Jetson TK1平台安装使用ROS
  3. PCL:描述三维离散点的ROPS特征(Code)
  4. SpringMVC (六)注解式开发
  5. 红外摄像机的功率究竟有多大
  6. Linux 应用程序开发入门
  7. Activity启动模式 launchMode
  8. HAProxy高并发问题解决
  9. ASP网站精品源码集合(免积分下载)
  10. Javascript对象探讨