此文章与简书内容同步更新https://www.jianshu.com/p/3dac1db27247

首先是微信APP的支付流程,看着很多流程,其实主要的大致分为以下几个步骤

1.客户端选择商品下单(即要购买的这个物品多少钱,我就向微信支付服务端发送金额的参数为多少)

2.微信支付服务端收到你的消息后,再去调用统一下单的API(这个要看支付的文档了,一般这个API的地址是不变的)

3.微信支付服务端获取到预订单信息时再发送给微信支付APP端,APP将通过SDK调起支付。

下面贴下相关参考代码

try {String url = "http://www.xxx.com/?user_id=" + account + "&totalFee=" +  total_fee*100;byte[] buf = Util.httpGet(url);if (buf != null && buf.length > 0) {String content = new String(buf);Log.e("get server pay params:", content);JSONObject json = new JSONObject(content);if (null != json && !json.has("retcode")) {PayReq req = new PayReq();req.appId = json.getString("appid");req.partnerId = json.getString("partnerid");req.prepayId = json.getString("prepayid");req.nonceStr = json.getString("noncestr");req.timeStamp = json.getString("timestamp");req.packageValue = json.getString("package");req.sign = json.getString("sign");req.extData = "app data"; // optionalToast.makeText(MainActivity.this, "调起支付中...", Toast.LENGTH_SHORT).show();// 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信api.sendReq(req);} else {Log.d("PAY_GET", "返回错误" + json.getString("retmsg"));Toast.makeText(MainActivity.this, "返回错误" + json.getString("retmsg"), Toast.LENGTH_SHORT).show();}} else {Log.d("PAY_GET", "服务器请求错误");Toast.makeText(MainActivity.this, "服务器请求错误", Toast.LENGTH_SHORT).show();}} catch (Exception e) {Log.e("PAY_GET", "异常:" + e.getMessage());Toast.makeText(MainActivity.this, "异常:" + e.getMessage(), Toast.LENGTH_SHORT).show();}

接下来是微信支付服务端

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubSystem.err.println(request.getParameter("user_id"));System.err.println(request.getParameter("totalFee"));String  user_id = request.getParameter("user_id");String  totalFee = request.getParameter("totalFee");String attach = "{\"user_id\":\"" + user_id + "\"}";wxPayService = new WXserviceImpl();System.err.println(wxPayService);try {//请求预支付订单Map<String, String> result = wxPayService.dounifiedOrder(attach, totalFee);JSONObject map = new JSONObject();WxMD5Util md5Util = new WxMD5Util();map.put("appid", result.get("appid"));map.put("partnerid", result.get("mch_id"));map.put("prepayid", result.get("prepay_id"));map.put("package", "Sign=WXPay");map.put("noncestr", result.get("nonce_str"));map.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000));//单位为秒String sign = md5Util.getSign(map);map.put("sign",sign);map.put("extdata", attach);response.setCharacterEncoding("utf-8");response.setContentType("application/json; charset=utf-8");response.getOutputStream().write(map.toString().getBytes("utf-8"));// 指定编码为utf-8} catch (Exception e) {// TODO: handle exceptionSystem.err.println("异常信息"+e);}}
/*** 调用官方SDK 获取预支付订单等参数* @param attach 额外参数* @param total_fee 总价* @return* @throws Exception*/@Overridepublic Map<String, String> dounifiedOrder(String attach, String total_fee) throws Exception {WxMD5Util md5Util = new WxMD5Util();Map<String, String> returnMap = new HashMap<>();WXConfigUtil config = new WXConfigUtil();System.err.println("使用官方API请求预付订单");WXPay wxpay = new WXPay(config);Map<String, String> data = new HashMap<>();//生成商户订单号,不可重复String out_trade_no = "wxpay" + System.currentTimeMillis();data.put("appid", config.getAppID());data.put("mch_id", config.getMchID());data.put("nonce_str", WXPayUtil.generateNonceStr());String body = "订单支付";data.put("body", body);data.put("out_trade_no", out_trade_no);data.put("total_fee", total_fee);//自己的服务器IP地址data.put("spbill_create_ip", SPBILL_CREATE_IP);//异步通知地址(请注意必须是外网)data.put("notify_url", NOTIFY_URL);//交易类型data.put("trade_type", TRADE_TYPE_APP);//附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据data.put("attach", attach);String sign1 = md5Util.getSign(data);data.put("sign", sign1);System.err.println("使用官方API请求预付订单");try {//使用官方API请求预付订单Map<String, String> response = wxpay.unifiedOrder(data);System.out.println(response);String returnCode = response.get("return_code");    //获取返回码//若返回码为SUCCESS,则会返回一个result_code,再对该result_code进行判断if (returnCode.equals("SUCCESS")) {//主要返回以下5个参数String resultCode = response.get("result_code");returnMap.put("appid", response.get("appid"));returnMap.put("mch_id", response.get("mch_id"));returnMap.put("nonce_str", response.get("nonce_str"));returnMap.put("sign", response.get("sign"));if ("SUCCESS".equals(resultCode)) {//resultCode 为SUCCESS,才会返回prepay_id和trade_type//获取预支付交易回话标志returnMap.put("trade_type", response.get("trade_type"));returnMap.put("prepay_id", response.get("prepay_id"));return returnMap;} else {//此时返回没有预付订单的数据return returnMap;}} else {return returnMap;}} catch (Exception e) {System.out.println(e);//系统等其他错误的时候}return returnMap;}

需要注意的是微信支付服务端需要APPID,商户号,商户秘钥以及从微信商户平台下载的安全证书(确保支付安全),对于支付成功的回调,查询订单和退订单,,这里就不在一一贴出了,有问题的可以留言或私信交流,一篇拙文,还望各位多多担待。

微信APP支付接入流程(含服务端,非第三方)相关推荐

  1. 支付宝、微信Android APP支付接入流程

    支付类型: 一次性支付 自动续费(支付宝周期扣款.微信委托扣款):1.支付并签约 2.先签约后扣费 注:微信委托扣款中先签约后扣费:自动续费.授权扣款.免密支付 支付宝 支付流程中各端交互逻辑 支付流 ...

  2. 微信APP支付申请流程

    1. 申请流程指引 1.1 申请流程图 1.2 申请接入步骤详细说明 1.2.1 到微信开放平台添加移动应用 目前仅对已通过认证的开发者创建的移动应用开放申请,请登录微信开放平台,添加移动应用,等待审 ...

  3. 支付宝APP支付 统一下单 php服务端 tp5

    /*支付宝第三方支付 * *生成APP支付订单信息 * @param number uid 用户id * @param string token 用户token * @param number oid ...

  4. php tp5支付宝app支付,支付宝APP支付 统一下单 php服务端 tp5

    { $data = input('post.'); Loader::import('/alipay/aop/AopClient',EXTEND_PATH); $aop = new \AopClient ...

  5. 支付宝 统一支付 php,支付宝APP支付 统一下单 php服务端 tp5

    { $data = input('post.'); Loader::import('/alipay/aop/AopClient',EXTEND_PATH); $aop = new \AopClient ...

  6. 微信app支付功能-服务端的实现-python3版

    微信app支付功能-服务端的实现-python3版 一:需求说明 二:微信app支付处理流程 三:所需依赖 3.1 支付配置 四:接口开发 4.1 创建订单接口 4.2 微信异步回调接口 4.3 订单 ...

  7. Android版-微信APP支付

    首发地址: Android版-微信APP支付 欢迎留言.转发 微信极速开发系列文章(微信支付.授权获取用户信息等):点击这里 目录 1.注册账号.开发者认证 2.添加应用 3.申请微信支付 4.技术开 ...

  8. 微信App支付总结(返回-1什么的最e心)

    微信支付总结 简介 微信支付商户平台官网:https://pay.weixin.qq.com 版权声明:本文为原创文章,未经允许不得转载 更新时间:2016/6/27 本文说明 现在很多项目都会集成微 ...

  9. 实现微信app支付的springboot项目

    1.1请先完成微信APP支付接入商户服务中心 1.2详情请参考微信官方文档:https://open.weixin.qq.com/ 2.application.yml文件的配置如下 #微信支付配置 t ...

最新文章

  1. linux网络虚拟化
  2. 通过SID查找历史执行的SQL语句
  3. 中文地址转英文地址网站_SSL证书可能让你网站源IP地址暴露
  4. Java JDBC连接oracle、SQL server、My Sql数据库的驱动
  5. 这个曾一票难求的AI大会,现在可以抢购早鸟票了丨MEET 2021
  6. good things to note for google scholar
  7. 2014末,Surface Pro 3叫好不叫座只是价格问题?
  8. html标签教案,第1章 HTML的基本标签-教案
  9. xwpftablecell设置字体样式_HTML的文字样式
  10. mysql查看系统可用字符集_MySQL查看所有可用的字符集
  11. TVP5158的多路复用技术
  12. [经典力学]牛顿自然哲学的数学原理论文解读
  13. RAL 2022|基于3D语义共视图的语义SLAM精确回环检测
  14. Multisim基础 电流控制的电流源 简单示例
  15. wxpython收费吗_使用wxPython开发一个简单GUI应用
  16. 全网首发!!C++20新特性全在这一张图里了
  17. 从底层操作系统到容器云平台:OpenCloudOS与秒云构筑完美兼容链
  18. 面试应该问公司什么问题
  19. Selenium WebDriver API 进阶使用,模块化参数化进行自动化测试设计
  20. linux mint 18.3 内核,Linux Mint 18.3 “Sylvia” Cinnamon 和 MATE版发布可下载

热门文章

  1. extern “C“详解
  2. 什么是RAID? RAID详解
  3. root锤子坚果手机系统,坚果手机root教程
  4. TI C6000 优化进阶:循环最重要!
  5. QT treewidget 双击信号与自定义槽】
  6. 弱市宜以股息收益率找黑马
  7. Windows下装linux子系统
  8. Ubuntu提示“没有根文件系统 ”
  9. PHP 对象继承和多态的实例
  10. Python python-docx 读写 word