app端微信支付(二) - 生成预付单
前一篇文章的时序图中说了,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 微信开放平台审核通过的应用APPID
private 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 用户端实际ip
private 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")
@ResponseBody
public 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(); // 用户IP
WXPrepay 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() {
// 创建HttpClientBuilder
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
// HttpClient
CloseableHttpClient 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端微信支付(二) - 生成预付单的更多相关文章
- PHP APP端微信支付
前面已经写了手机APP支付宝支付,今天再把手机APP微信支付补上,前期的准备工作在这里就不多说了,可以参考微信支付开发文档,一定要仔细阅读开发文档,可以让你少踩点坑:准备工作完成后就是配置参数,调用统 ...
- PHP实现 APP端微信支付功能
1.我封装好的一个支付类文件,多余的东西都去除掉了,并且把配置参数放到了这个支付类中,只需要修改Weixinpayandroid方法内的几个参数就可以直接复制使用: class Wxpayandroi ...
- .net core 支付宝,微信支付 二
源码: https://github.com/aspros-luo/Qwerty.Payment/tree/develop 今天开始微信支付 微信支付坑比较多,支付流程也不太一样,微信支付需要先生成预 ...
- 微信支付之01------获取订单微信支付二维码的接口------Java实现
[ 前言:以前写过一个获取微信二维码支付的接口,发现最近公司新开的项目会经常用到,现在我又翻出代码看了一遍,觉得还是把整个代码流程记下来的好 ] 借鉴博客: 他这篇博客写得不错,挺全的:https:/ ...
- app集成微信支付服务端代码-php版本
1.微信支付分为两种,一种是微信公众品台的微信支付,另一种是微信开放平台的微信支付 2.上周做的是开放品台的微信支付,把遇到的问题总结一下 第一,下载官方提供的代码,解压后放到根目录下,然后认真读文档 ...
- Android app 第三方微信支付接入详解
微信支付做了好几遍了,都没有出现什么棘手的问题,下面一一为大家分享一下,欢迎吐槽. 还是老样子,接入微信的支付要第一步添加微信支付官方的包libammsdk.jar 首先就处理略坑的一个问题,app应 ...
- Java+微信支付(下预购单+回调+退款+查询账单)
前言: 现在的APP的离不开微信支付, 现在项目里接入微信支付 , 微信支付的官方文档是:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chap ...
- PHP APP端支付宝支付
应业务需求,做了支付宝支付和微信支付,今天分享一下手机端app支付宝支付对接流程,实际开发过程是前后端分离,前端调用后端API接口,实现功能返回数据,我所用的跨挤啊为TP5,大致可以分为四步: 1.在 ...
- app使用微信支付成功后,点击返回到该app却跳到另外一个app去了
刚接手了公司iOS的两个APP, 现在碰到了这样一个问题: 有一台iPhone在一个APP中使用了微信支付,支付成功后,点击返回到该APP,结果却跳到了另外一个APP去了. 这两个APP都是公司开发的 ...
随机推荐
- ios 控件代码transform学习笔记
1.图片设置(平移,缩放,旋转) 创建一个transform属性 //按钮点击时,只能执行一次向上旋转 //派 M_PI_4 45度旋转 . CGAffineTransform transforms= ...
- python中global 和 nonlocal 的作用域
python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 . 一 global global关键字用来在函数或其他局部作用域 ...
- [moka同学笔记]Linux命令基本格式及目录处理命令
命令提示符 [root@localhost ~]# root:当前登录用户localhost:主机名~:当前所在的目录,此处为"家"目录#:root超级用户的提示符,如果是普通用户 ...
- Hibernate总结(一)
Hibernate为了提高性能,提供了缓存与快照机制. 它的缓存分为一级缓存与二级缓存. Hibernate一级缓存:当一个事务中执行一次Sql语句时,就将返回的结果存储在Session中的Map集合 ...
- Netty(五)序列化protobuf在netty中的使用
protobuf是google序列化的工具,主要是把数据序列化成二进制的数据来传输用的.它主要优点如下: 1.性能好,效率高: 2.跨语言(java自带的序列化,不能跨语言) protobuf参考文档 ...
- jquery如何实现(textarea) placeholder自动换行?
思路:利用文本框的聚焦和失焦事件 1.HTML结构 <textarea id="text1"></textarea> 2.js方法 <script&g ...
- 网页端实现input数字输入框
实现input输入框只能输入数字的效果: <input type="text" name="" id="phoneNum" value ...
- Android开发1:基本UI界面设计——布局和组件
前言 啦啦啦~本学期要开始学习Android开发啦~ 博主在开始学习前是完完全全的小白,只有在平时完成老师要求的实验的过程中一步一步学习~从此篇博文起,博主将开始发布Android开发有关的博文,希望 ...
- MDM证书申请的流程
MDM证书申请的流程 整个流程分为两部分:vendor,customer. 一.Vendor 1.成为一个 MDM Vendor 1) 首先你需要拥有一个 Apple Enterprise accou ...
- Android Json处理框架
1.Android 中的Json解析工具fastjson .序列化.反序列化 2.Android Gson的使用总结 3.Android-JSONTool 一个简易的Json框架类,小到只有一个类 有 ...