吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 10166|回复: 41
收起左侧

[Java 转载] 【分享】微信APP支付Java版的一个小demo

  [复制链接]
逆风的snail 发表于 2017-7-24 10:44
本帖最后由 wushaominkk 于 2018-5-2 13:54 编辑

前一段时间公司搞微信的APP支付,看过微信的官方文档之后只能感叹自己果然还是太嫩,只有思想,连个demo都没有,上网到处查找资料之后找了一个博主分享的看着相对靠谱的下载下来配置好了,改了一些回调方面的错误,终于能正常运行,分享一下,给需要的人!
个人觉得核心部分的代码:
签名:

//参数:开始生成签名  
      
[Java] 纯文本查看 复制代码
  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);  






[Java] 纯文本查看 复制代码
/** 
     * 微信支付签名算法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格式丢给微信:

[Java] 纯文本查看 复制代码
/** 
     * 构造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>[url]http://wxpay.weixin.qq.com/pub_v2/pay/notify.v2.php</notify_url>[/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> 
         */  

  
      
[Java] 纯文本查看 复制代码
 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 "";  
    }  




[Java] 纯文本查看 复制代码
//构造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端处理好后再由微信开始回调,回调就会跳转到你的回调地址上,微信说建议校验下签名,照做就是的!


[Java] 纯文本查看 复制代码
/** 
     * 微信支付回调 
     * @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();  
        }  
    }  




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



觉得有用的欢迎评分!!!

微信APP支付demo.rar

192.1 KB, 下载次数: 171, 下载积分: 吾爱币 -1 CB

免费评分

参与人数 8吾爱币 +10 热心值 +6 收起 理由
yml0102 + 1 + 1 谢谢@Thanks!
itking024 + 1 谢谢@Thanks!
99910369 + 1 + 1 用心讨论,共获提升!
小范 + 3 我很赞同!
wolf豪 + 1 + 1 谢谢@Thanks!
gpfyj + 1 + 1 我很赞同!
wulincheng + 1 + 1 我很赞同!
白笙 + 1 + 1 用心讨论,共获提升!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

lqy144032 发表于 2018-11-2 09:07
在拼接xml请求支付时,微信没给你们公司发邮件么(说存在XXE漏洞),其实我认为是微信自己的问题,后来看了官方文档,建议是由微信自己封装的方法将map2xml和xml2map,不要循环拼接,这样微信就不会给警告了.可以参考一下 https://www.cnblogs.com/future/p/9266387.html
verybest2012 发表于 2017-7-24 10:46
lkjlkjhong 发表于 2017-7-24 10:55
87266381 发表于 2017-7-24 10:55
下载试验下怎么样
 楼主| 逆风的snail 发表于 2017-7-24 10:57
87266381 发表于 2017-7-24 10:55
下载试验下怎么样

有问题可以探讨沟通
luojizhihen 发表于 2017-7-24 10:58
谢谢楼主分享。
黑山走天涯 发表于 2017-7-24 11:01
支持下!谢谢分享!!!
落枫BJ 发表于 2017-7-24 11:06
牛的一批!
星落秋枫 发表于 2017-7-24 11:07
还没试过用java搞这个
白笙 发表于 2017-7-24 11:09
谢谢分享!可能以后用得到也说不定。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 03:51

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表