(先补充一下,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. ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost:3306' (10061)

    ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost:3306' (10061) 报错原因:电脑之前有个5.0.2版本的mys ...

  2. vue-cli-serve启动报错

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

  3. c++获取类型信息

    获取类型信息 typeid typeid运算符用来获取一个表达式的类型信息. 对于基本类型数据, 类型信息比较简单, 主要指数据的类型; 对于对象(类类型的数据), 类型信息指: 对象所属的类, 所包 ...

  4. Bugku-ez_misc[wp]

    题目描述 1.拿到一份abc.rar文件,里面有一个加密call.png (1)通过file  . binwalk . 伪加密一顿小输出都不行,于是放进16进制编辑器查看: 文件头不对! (2)修改为 ...

  5. Mac新手必看Mac入门基本知识图文教程

    你已经是Mac的用户了吗?还是准备入手的新手呢? 赶快看看"Mac入门基本知识"吧! macbook系统基础内容简介 Mac入门基本知识 1.主界面结构图基本知识介绍(如图所示) ...

  6. 题解[CF1628F]A_Random_Code_Problem

    题意 给定一个数组 \(a\),进行 \(k\) 次操作.第 \(i\) 操作等概率随机 \(a\) 中一个元素 \(a_x\),将这个元素的值加入答案,并使其减去 \(a_x\bmod i\) .问 ...

  7. vue中组件传值的几种方式

    一.父组件给子组件传值方式(步骤) 1.VC1(子组件)定义props[a,b,c] 注意:props中的每个值都可以加各种修饰,如数据类型,是否可为空,默认值... 2.VC2(父组件)引用子组件 ...

  8. unity3D mirror网络游戏开发笔记

    最近想开发一款多人在线网络游戏,使用unity3d的mirror插件可以提高开发效率,并且该插件免费. 但是由于使用插件开发效率太低,经过研究,ummorpg开发模板是居于该插件开发而来,使用它可以提 ...

  9. dll帮助类

    项目中有很多时候用到外部dll,调用的时候如果用静态调用,程序exe目录下有很多dll,看起来很乱,不利于后续维护:动态调用可以把dll放在想放的文件夹内,但是如果一个dll要用到的函数很多,动态调用 ...

  10. [前端js] 爬取亿图脑图大纲

    这段程序使看到了好的东西,又没有零钱的产物 还是老师让画思维导图我不想画还想白嫖的想法 用时20分钟 就拿这个来作为例子 https://mm.edrawsoft.cn/template/286842 ...