(先补充一下,app唤醒微信支付失败的话,在确保没错的情况下,建议换一个手机或者重新下载微信,不知道是微信缓存还是什么原因)

1、先申请好开发环境

app支付不需要公众号,所以申请好开发商号和开发平台的app应用即可,获取到如下图的几个

还有就是在申请应用的时候记得设置正确的应用包名和应用签名。

2、可以查看微信开发文档(https://pay.weixin.qq.com/)。

controller层

/**
* @description: 微信支付开始下单
* @date: 2021/6/7
*/
@GetMapping("/createOrder")
public JsonData createOrder(@RequestParam(value = "videoId", required = true) int videoId,
@RequestParam(value = "userId", required = true) int userId,
HttpServletRequest request,
HttpServletResponse response) throws Exception { Map<String, String> map = videoOrderService.wxSave(videoId, userId,request);
// if (codeUrl == null) {
// throw new NullPointerException();
// }
return JsonData.buildSuccess(map,"微信支付获取codeUrl")}

serviceImpl层

需要先引入pom文件

<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
/**
* 微信生成订单
*
* @param videoId
* @param userId
*/
@Override
public Map<String, String> wxSave(int videoId, int userId,HttpServletRequest request) throws Exception { Video video = videoMapper.selectById(videoId);
//AppUser appUser = appUserMapper.selectById(userId);
//生成订单
VideoOrder videoOrder = new VideoOrder();
videoOrder.setVideoId(video.getId());
videoOrder.setOutTradeNo(CommonUtils.generateUUID());
     //未支付的状态
videoOrder.setState(0);
videoOrder.setCreateTime(new Date());
videoOrder.setTotalFee(video.getPrice());
videoOrder.setVideoId(video.getId());
videoOrder.setVideoTitle(video.getTitle());
videoOrder.setVideoImg(video.getCoverImg());
videoOrder.setUserId(userId);

     //先生成订单信息,支付状态设置为未支付
Map<String, String> codeUrl = unifiedOrder(videoOrder,request); return codeUrl;
}

private Map<String, String> unifiedOrder(VideoOrder videoOrder,HttpServletRequest request) throws Exception {

        //生成未支付订单
int insert = videoOrderMapper.insert(videoOrder);
     //这些字段都可以在开发文档上找到,尽量直接复制,以免打错
SortedMap<String,String> params = new TreeMap<>();
params.put("appid",weChatConfig.getAppid());
params.put("mch_id",weChatConfig.getMchId());
params.put("nonce_str",CommonUtils.generateUUID());
params.put("body",videoOrder.getVideoTitle());
params.put("out_trade_no",videoOrder.getOutTradeNo());
params.put("total_fee",String.valueOf(1));
params.put("spbill_create_ip",getRealIp(request));
params.put("notify_url",weChatConfig.getNotifyUrl());
params.put("trade_type","APP"); //生成签名/这里也可以用微信支付的自带的工具类,WXPayUtil.generateSignedXml(params,weChatConfig.getKey());
String sign = WxPayUtil.createSign(params,weChatConfig.getKey()); params.put("sign",sign); String payXml = WxPayUtil.mapToXml(params); System.out.println(payXml);
//统一下单
String orderStr = HttpUtils.doPost(weChatConfig.getUnifiedOrderUrl(),payXml,4000);
if(null == orderStr) {
return null;
} Map<String, String> unifiedOrderMap = WXPayUtil.xmlToMap(orderStr);
System.out.println(unifiedOrderMap.toString()); //unifiedOrderMap.put("timestamp",String.valueOf(System.currentTimeMillis()/1000));
Long timeStamp = System.currentTimeMillis() / 1000; SortedMap<String, String> ps = new TreeMap();
ps.put("appid", unifiedOrderMap.get("appid"));
ps.put("partnerid", weChatConfig.getMchId());
ps.put("noncestr", unifiedOrderMap.get("nonce_str"));
ps.put("package","Sign=WXPay");
ps.put("prepayid",unifiedOrderMap.get("prepay_id"));
ps.put("timestamp", String.valueOf(timeStamp));
//二次签名
String sign2 = WxPayUtil.createSign(ps,weChatConfig.getKey());
ps.put("sign",sign2); String s = WxPayUtil.mapToXml(ps);
System.out.println(s);
System.out.println(ps.toString());
return ps; }

统一下单封装方法

/**
* 封装post
* @return
*/
public static String doPost(String url, String data,int timeout){
CloseableHttpClient httpClient = HttpClients.createDefault();
//超时设置 RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(timeout) //连接超时
.setConnectionRequestTimeout(timeout)//请求超时
.setSocketTimeout(timeout)
.setRedirectsEnabled(true) //允许自动重定向
.build(); HttpPost httpPost = new HttpPost(url);
httpPost.setConfig(requestConfig);
httpPost.addHeader("Content-Type","text/html; chartset=UTF-8"); if(data != null && data instanceof String){ //使用字符串传参
StringEntity stringEntity = new StringEntity(data,"UTF-8");
httpPost.setEntity(stringEntity);
} try{ CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
if(httpResponse.getStatusLine().getStatusCode() == 200){
String result = EntityUtils.toString(httpEntity);
return result;
} }catch (Exception e){
e.printStackTrace();
}finally {
try{
httpClient.close();
}catch (Exception e){
e.printStackTrace();
}
} return null; }

app对接微信支付(app支付)的更多相关文章

  1. php对接微信小程序支付

    前言:这里我就假装你已经注册了微信小程序,并且基本的配置都已经好了.注: 个人注册小程序不支持微信支付,所以我还是假装你是企业或者个体工商户的微信小程序,其他的商户号注册,二者绑定,授权,支付开通,就 ...

  2. java对接微信支付

    对接微信扫码支付(模式2),前端使用velocity技术 (1)调用微信支付接口(view层)  此部分业务逻辑部分可以省略 @RequestMapping("/wxpay.htm" ...

  3. app使用微信支付成功后,点击返回到该app却跳到另外一个app去了

    刚接手了公司iOS的两个APP, 现在碰到了这样一个问题: 有一台iPhone在一个APP中使用了微信支付,支付成功后,点击返回到该APP,结果却跳到了另外一个APP去了. 这两个APP都是公司开发的 ...

  4. 微信支付 APP 支付方式的服务器端处理程序

    对于微信的APP的支付,客户服务说只能通过微信开放平台申请.后来在公众帐号确实发现了证据:  微信支付在申请的时候就比较严(麻烦),对服务类的一些支付,本来商品就是虚拟的,所以需要将商品描述的比较详细 ...

  5. App对接支付宝移动支付功能

    前段时间看了下app对接支付宝移动支付的功能,并自己总结了下支付宝移动支付的实现流程 一.申请流程          前提是已有现成的应用. 1.  申请地址            https://b ...

  6. 微信公众号支付|微信H5支付|微信扫码支付|小程序支付|APP微信支付解决方案总结

    最近负责的一些项目开发,都用到了微信支付(微信公众号支付.微信H5支付.微信扫码支付.APP微信支付).在开发的过程中,在调试支付的过程中,或多或少都遇到了一些问题,今天总结下,分享,留存. 先说注意 ...

  7. iOS实现微信外部H5支付完成后返回原APP

    看到微信最近放开了微信H5支付,公司决定把H5集成到多款APP上.下面记录下了开发过程. 由于是微信新推出的支付方式,在网上搜索到的相关资料并不多,其中有一篇文件(点此跳转)对我的整个开发过程起到了很 ...

  8. asp.net core 微信扫码支付(扫码支付,H5支付,公众号支付,app支付)之1

    2018-08-13更新生成二维码的方法 在做微信支付前,首先要了解你需要什么方式的微信支付,目前本人做过的支付包含扫码支付.H5支付.公众号支付.App支付等,本人使用的是asp.net mvc c ...

  9. 微信支付-微信公众号支付,微信H5支付,微信APP支付,微信扫码支付

    在支付前,如果使用第三方MVC框架,则使用重写模式,服务器也需要配置该项 if (!-e $request_filename){ rewrite ^/(.*)$ /index.php/$ last; ...

  10. 不接入微信sdk,在APP中实现微信分享,支付

    前段时间在很多地方接入了微信的sdk,发现过程比较繁琐,此外因为导入的sdk比较大会影响最终APP打包的体积,所以就有了不接入sdk也实现相同的功能的想法. 要实现这个目标我个人认为最困难的地方是不知 ...

随机推荐

  1. 【FPGA学习】MATLAB和FPGA实现FFT

    本博客记录一下在matlab设计和在FPGA平台实现FFT的方法,平台是Xilinx的ZYNQ 参考: COE文件制作与使用 Vivado使用技巧(9):COE文件使用方法 .coe文件生成 在某些I ...

  2. TypeError: unsupported operand type(s) for |=: 'dict' and 'dict'

    原因:python3.9 支持对 dict 类型使用 |, 而较老的版本不支持 解决方案 :1. 用更新的 python 2. 把 | 操作替换成 {**d1, **d2} 来源:https://st ...

  3. vue-cli-serve启动报错

    报错信息: > vue-cli-service serve INFO Starting development server... 10% building 2/2 modules 0 acti ...

  4. [UnityShader]unity中2D Sprite显示阴影和接受阴影

    首先是效果 要让2D显示阴影,首先假设知道Unity阴影来源(shader中的ShadowCaster) 最简单的方法是,首先从官网下载Sprite-Default.Shader,查看源码 然后复制粘 ...

  5. C - Functions again CodeForces - 789C (dp、思维)

    C - Functions again CodeForces - 789C #include<iostream> #include<cstdio> #include<cm ...

  6. Cookie之记录用户上次访问时间

    Cookie之记录用户访问时间 需求: 需求: 1:用户访问服务器(Servlet),判断用户是否是第一次访问,如果是第一次访问,则在页面响应内容为:"您好,欢迎您首次访问"; 2 ...

  7. go+redis实现消息队列发布与订阅

    在做项目过程中,实现websocket得时候,不知道哪里写的不太合适,客户端消息收到一定程度,剩下的消息收不到,修改了缓冲区大小,还是没有解决问题,后面因为项目结束期比较紧张,没有时间调试消息的时候, ...

  8. 使用vue+iview创建自己的对话框组件

    通过对别的案例反复研究,终于总结出自己对于使用vue+iview创建组件的步骤: 第一步:编辑新建对话框组件(子组件) <template> <div> <!-- mod ...

  9. 【CDH】cdh搭建遇到的坑和解决过程

    本人安装CDH时,使用的是在线安装方式,就是yum install XXX XXX XXX这种.所以安装目录都是默认的目录. Linxu:centos 7 一,启动cloudera-scm-agent ...

  10. 【个人笔记】CentOS 安装 Docker CE

    要在 CentOS 上开始使用 Docker CE,请确保 满足先决条件,然后 安装Docker. 1. 卸载旧版本 sudo yum remove docker docker-client dock ...