(先补充一下,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. taro框架开发微信小程序遇到的问题

    ios端,如果input放在了dispplay flex里面,会导致一系列问题 滑动屏幕,键盘不收起,input值随屏幕滚动 input之前切换,键盘不弹起来或有时弹有时不弹 键盘莫名收起 input ...

  2. zabbix-agent2安装问题汇总

    1.yum源报错 # 具体报错信息 failure: repodata/4bb73bd0742c638c3cd1e73a5f3dc8838c7b0d693c9f50b7ed8266c3e83308d3 ...

  3. mysql库操作msyql

    查看所有数据库 show databases; 查看当前使用的数据库 select database(); 使用数据库 use 数据库名; 创建数据库 create database 数据库名 cha ...

  4. 在windows服务中托管asp.net.core

    参考:https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/windows-service?view=aspnetcore-3.1& ...

  5. CryptoKit 实现 椭圆曲线ECC加密

    1.有没有一种方式让两个人的对话绝对安全呢?答案是肯定有的 那就是使用 椭圆曲线ECC加密 2.椭圆曲线ECC加密原理 假设有两个用户A和B .A随机生成一个密码对包含了公钥和私钥 同理B也随机生成一 ...

  6. 清除Linux登录记录

    CentOS cat /dev/null > /var/log/wtmp cat /dev/null > /var/log/btmp cat /dev/null > /var/log ...

  7. 二叉树TwT

    L2-011 玩转二叉树 给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列.所谓镜面反转,是指将所有非叶结点的左右孩子对换.这里假设键值都是互不相等的正整数. ...

  8. 集合(Collection)

    前几天做数据结构题碰到了集合,当时并没有学,只是通过做题对此稍微有了了解.今天正好学到了,来做一下学习记录. 一.集合总体框架 由上图可知,集合的实现方式有两大类: (1)线性接口:该集合的顶层接口是 ...

  9. C# 将Dll文件打包到exe中

    首先在资源管理里面将需要使用的dll添加进入 然后将dll文件的生成操作改成嵌入的资源 然后新建一个类  LoadResourceDll.cs 1 using System; 2 using Syst ...

  10. SingleFlight

    Go 语言扩展包中提供了另一种同步原语,它能够在一个服务中抑制对下游的多次重复请求.一个比较常见的使用场景是:我们在使用 Redis 对数据库中的数据进行缓存,发生缓存击穿时,大量的流量都会打到数据库 ...