老早就像做支付模块的东西,因为觉得很高大上,很早就开始把微信支付模块的重心签名给做好了,一直就缺个商家的key,现在有幸来电商公司,哈哈,果然一切很顺利,能够很给力地App端提供支持;

个人觉得核心部分的代码:

签名:

//参数:开始生成签名SortedMap<Object,Object> parameters = new TreeMap<Object,Object>();parameters.put("appid", appid);parameters.put("mch_id", mch_id);parameters.put("nonce_str", nonce_str);parameters.put("body", body);parameters.put("nonce_str", nonce_str);parameters.put("detail", detail);parameters.put("attach", attach);parameters.put("out_trade_no", out_trade_no);parameters.put("total_fee", total_fee);parameters.put("time_start", time_start);parameters.put("time_expire", time_expire);parameters.put("notify_url", notify_url);parameters.put("trade_type", trade_type);parameters.put("spbill_create_ip", spbill_create_ip);
/*** 微信支付签名算法sign* @param characterEncoding* @param parameters* @return*/@SuppressWarnings("rawtypes")public static String createSign(String characterEncoding,SortedMap<Object,Object> parameters){StringBuffer sb = new StringBuffer();Set es = parameters.entrySet();//所有参与传参的参数按照accsii排序(升序)Iterator it = es.iterator();while(it.hasNext()) {Map.Entry entry = (Map.Entry)it.next();String k = (String)entry.getKey();Object v = entry.getValue();if(null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {sb.append(k + "=" + v + "&");}}sb.append("key=" + Key);System.out.println("字符串拼接后是:"+sb.toString());String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();return sign;}

将一坨参数包装成XML格式丢给微信:

/*** 构造xml参数* @param xml* @return*/public static String xmlInfo(Unifiedorder unifiedorder){//构造xml参数的时候,至少有10个必传参数/** <xml><appid>wx2421b1c4370ec43b</appid><attach>支付测试</attach><body>JSAPI支付测试</body><mch_id>10000100</mch_id><nonce_str>1add1a30ac87aa2db72f57a2375d8fec</nonce_str><notify_url>http://wxpay.weixin.qq.com/pub_v2/pay/notify.v2.php</notify_url><openid>oUpF8uMuAJO_M2pxb1Q9zNjWeS6o</openid><out_trade_no>1415659990</out_trade_no><spbill_create_ip>14.23.150.211</spbill_create_ip><total_fee>1</total_fee><trade_type>JSAPI</trade_type><sign>0CB01533B8C1EF103065174F50BCA001</sign></xml>*/if(unifiedorder!=null){StringBuffer bf = new StringBuffer();bf.append("<xml>");bf.append("<appid><![CDATA[");bf.append(unifiedorder.getAppid());bf.append("]]></appid>");bf.append("<mch_id><![CDATA[");bf.append(unifiedorder.getMch_id());bf.append("]]></mch_id>");bf.append("<nonce_str><![CDATA[");bf.append(unifiedorder.getNonce_str());bf.append("]]></nonce_str>");bf.append("<sign><![CDATA[");bf.append(unifiedorder.getSign());bf.append("]]></sign>");bf.append("<body><![CDATA[");bf.append(unifiedorder.getBody());bf.append("]]></body>");bf.append("<detail><![CDATA[");bf.append(unifiedorder.getDetail());bf.append("]]></detail>");bf.append("<attach><![CDATA[");bf.append(unifiedorder.getAttach());bf.append("]]></attach>");bf.append("<out_trade_no><![CDATA[");bf.append(unifiedorder.getOut_trade_no());bf.append("]]></out_trade_no>");bf.append("<total_fee><![CDATA[");bf.append(unifiedorder.getTotal_fee());bf.append("]]></total_fee>");bf.append("<spbill_create_ip><![CDATA[");bf.append(unifiedorder.getSpbill_create_ip());bf.append("]]></spbill_create_ip>");bf.append("<time_start><![CDATA[");bf.append(unifiedorder.getTime_start());bf.append("]]></time_start>");bf.append("<time_expire><![CDATA[");bf.append(unifiedorder.getTime_expire());bf.append("]]></time_expire>");bf.append("<notify_url><![CDATA[");bf.append(unifiedorder.getNotify_url());bf.append("]]></notify_url>");bf.append("<trade_type><![CDATA[");bf.append(unifiedorder.getTrade_type());bf.append("]]></trade_type>");bf.append("</xml>");return bf.toString();}return "";}
//构造xml参数String xmlInfo = HttpXmlUtils.xmlInfo(unifiedorder);String wxUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder";String method = "POST";String weixinPost = HttpXmlUtils.httpsRequest(wxUrl, method, xmlInfo).toString();

因为body部分是商品的名称什么的,设计到中文,这个过程可能毁在统一下单的时候提醒:body不是UTF-8编码(我擦,我就在这里折腾了半天的 http://blog.csdn.net/xb12369/article/details/50512633)

然后开始统一下单得到预支付ID,包装好给app端,app端处理好后再由微信开始回调,回调就会跳转到你的回调地址上,微信说建议校验下签名,照做就是的!

/*** 微信支付回调* @param request* @param resposne*/@RequestMapping(value="/notifyUrlWeixin")public void notifyWeixinPayment(HttpServletRequest request,HttpServletResponse response){try{BufferedReader reader = request.getReader();String line = "";StringBuffer inputString = new StringBuffer();try{PrintWriter writer = response.getWriter();while ((line = reader.readLine()) != null) {inputString.append(line);}if(reader!=null){reader.close();}System.out.println("----[微信回调]接收到的报文---"+inputString.toString());if(!StringUtils.isEmpty(inputString.toString())){WXPayResult wxPayResult = JdomParseXmlUtils.getWXPayResult(inputString.toString());if("SUCCESS".equalsIgnoreCase(wxPayResult.getReturn_code())){SortedMap<Object,Object> parameters = new TreeMap<Object,Object>();parameters.put("appid", wxPayResult.getAppid());parameters.put("attach", wxPayResult.getAttach());parameters.put("bank_type", wxPayResult.getBank_type());parameters.put("cash_fee", wxPayResult.getCash_fee());parameters.put("fee_type", wxPayResult.getFee_type());parameters.put("is_subscribe", wxPayResult.getIs_subscribe());parameters.put("mch_id", wxPayResult.getMch_id());parameters.put("nonce_str", wxPayResult.getNonce_str());parameters.put("openid", wxPayResult.getOpenid());parameters.put("out_trade_no", wxPayResult.getOut_trade_no());parameters.put("result_code", wxPayResult.getResult_code());parameters.put("return_code", wxPayResult.getReturn_code());parameters.put("time_end", wxPayResult.getTime_end());parameters.put("total_fee", wxPayResult.getTotal_fee());parameters.put("trade_type", wxPayResult.getTrade_type());parameters.put("transaction_id", wxPayResult.getTransaction_id());//反校验签名String sign = WXSignUtils.createSign("UTF-8", parameters);if(sign.equals(wxPayResult.getSign())){//修改订单的状态orderService.alipayNotifyPayment(wxPayResult.getOut_trade_no(), wxPayResult.getTransaction_id(),2);writer.write(HttpXmlUtils.backWeixin("SUCCESS","OK"));}else{writer.write(HttpXmlUtils.backWeixin("FAIL","签名失败"));}}else{writer.write(HttpXmlUtils.backWeixin("FAIL",wxPayResult.getReturn_msg()));System.out.println("---------微信支付返回Fail----------"+wxPayResult.getReturn_msg());}if(writer!=null){writer.close();}}else{writer.write(HttpXmlUtils.backWeixin("FAIL","未获取到微信返回的结果"));}}catch(Exception e){e.printStackTrace();}}catch(Exception ex){ex.printStackTrace();}}

到这里差不多这个流程就算完了!!!!

下面是源码地址:http://download.csdn.net/detail/xb12369/9403396

注:1、修改资源文件中的  resources/sys.properties

#weixin apy
appid=你们的appid
mch_id=你们的mch_id
notify_url=你们的回调地址

2、key   weixin/Utils/WXSignUtils.java

//http://mch.weixin.qq.com/wiki/doc/api/index.php?chapter=4_3
//商户Key:改成公司申请的即可
//32位密码设置地址:http://www.sexauth.com/  jdex1hvufnm1sdcb0e81t36k0d0f15nc
private static String Key = "你们的Key";

好了后新建一个Test的项目就可以直接运行了

有人问我appid是啥,我。。。。。我说什么好呢?我是说还是不说呢?

o(︶︿︶)o 唉,说了没意思,这是最最基础的,不说有别扭,想想,还是贴出来咯~~

师傅领进门,修行个人呐

java版app微信支付服务端代码【手机app微信支付】相关推荐

  1. 服务端给手机APP写支付接口(微信)

    本文主要介绍怎么在服务端给手机APP写支付接口:以POST的方式. 需要引用第三方. using Senparc.Weixin.MP.TenPayLibV3; 整体来说就是写一个方法罢了. /// & ...

  2. java cxf服务端代码_【JAVA】 cxf 生成 webservice 服务端代码

    CXF Apache CXF = Celtix + XFire.CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding . ...

  3. java app支付_Java 微信支付之APP支付服务端 (一)

    Java 微信支付之APP支付服务端 (一) 如图所示,这是服务端要集成的所有微信接口.至于在开放平台申请就不做赘述了.主要流程,1.下单,2.异步通知,3.查询. 一.微信统一下单请求交易 /** ...

  4. java 支付宝服务端,支付宝app支付服务端的实现-Java版

    前言 最近在工作中需要使用支付宝app支付,在初次使用过程中也不可避免的出现了一些问题,那么本次随笔主要是概述支付宝app支付服务端的整个实现过程以及就服务端出现的一些问题做一些总结. 1.准备工作 ...

  5. Java 微信支付之APP支付服务端 (一)

    Java 微信支付之APP支付服务端 (一) 如图所示,这是服务端要集成的所有微信接口.至于在开放平台申请就不做赘述了.主要流程,1.下单,2.异步通知,3.查询. 一.微信统一下单请求交易 /*** ...

  6. 微信APP支付服务端和Android 端详解及其demo

    最近在开发APP微信支付和支付宝支付,Android 端和后端都是我自己开发的,发现两家公司的文档都不是很友好,特别是微信,接触过或者开发过的人都应该有所体会.因此我特意把开发的过程梳理了,做下记录, ...

  7. 微信app支付服务端开发记录

    微信APP支付服务端 调用接口需要注意事项: 1.签名:需要全部参数参加签名,空值去掉.(实际传递了什么参数需要,就根据实际参数进行签名) 2.签名参数:appid是申请支付功能的app对于的ID,k ...

  8. 微信支付服务端自动对账

    微信支付服务端自动对账 支付及对账流程链接 自动对账说明 微信支付后每天的商户系统的自动对账还是比较繁琐的,所谓自动对账实际上就是将商户某天交易成功的订单信息与微信某天的账单进行逐一匹配的过程.其涉及 ...

  9. java web启动socket_javaweb启动时启动socket服务端代码实现

    这篇文章主要介绍了javaweb启动时启动socket服务端代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 说明:在javaweb项目启动的 ...

最新文章

  1. pytorch 序列化性能测试
  2. js数组的sort排序详解
  3. 有小数点的补码怎么算_写给投资小白,指数基金,在哪买?怎么买?
  4. RTC 音频质量评价和保障
  5. java tomcat jms_JavaWeb之使用Tomcat、JNDI与ActiveMQ实现JMS消息通信服务
  6. python的基本语术_一起学python-彻底掌握专业术语“变量”的概念
  7. CSDN 代码不能语法高亮的原因
  8. 玩了5万局游戏,英伟达让GameGAN自己生成「吃豆人」,世界首创无需游戏引擎...
  9. linux文件内核目录,Linux内核目录文件简介
  10. 浅析C#中的文件操作
  11. oracle ebs form视频,Oracle EBS教学视频
  12. 计算机技能比赛试题,计算机技能竞赛比赛试题文字录入WORDEXCEL
  13. 心理学推荐书籍——《九型人格》
  14. python正弦函数_Python之正弦曲线实现方法分析
  15. 人性化,中国制造新境界
  16. 微信小程序 保存base64图片和普通图片
  17. 页面加载更多的css,十种加载样式
  18. spark sql uv_使用Spark Streaming SQL进行PV/UV统计-阿里云开发者社区
  19. 使用gdebi去解决安装deb包的时候软件依赖问题
  20. SAP中采购收货控制中的配置问题分析

热门文章

  1. springboot集成redis redis配置手把手交你不踩坑
  2. 对于GetBuffer() 与 ReleaseBuffer() 的一些分析
  3. 向指定URL发送GET或POST请求(调第三方接口)
  4. 通过SQL注入拿到管理员密码
  5. java 时间字符串 转换_java实现时间与字符串之间转换
  6. python编程 上册第4版_四年级语文上册第4课繁星讲解及PPT课件下载
  7. 浅析瀑布流布局及其原理
  8. 微信小程序开发小程序下厨房|菜谱项目
  9. 2022年WordPress主题最优秀热门主题排名TOP30
  10. swiper在vue2中的使用