好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

java实现微信支付结果通知

支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。

对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。 (通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)

注意: 同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。
推荐的做法是,当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。

特别提醒:商户系统对于支付结果通知的内容一定要做签名验证,防止数据泄漏导致出现[假通知],造成资金损失。

 

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

//支付结果通知接口

 

   @requestmapping ( "/qlydweixinotify.do" )

   public void weixinotify(httpservletrequest request,

       httpservletresponse response) {

     printwriter out = null ;

     stringbuffer xmlstr = new stringbuffer();

     try {

       bufferedreader reader = request.getreader();

       string line = null ;

       while ((line = reader.readline()) != null ) {

         xmlstr.append(line);

       } 

       logger.getlogger(getclass()).debug( "支付回调通知:" +xmlstr.tostring());

       //检查xml是否有效

       boolean flag=signature.checkissignvalidfromresponsestring(xmlstr.tostring());

       weixinnotifyresult result= null ;

       if (flag){

         notifyresdata wxdata=(notifyresdata) util.getobjectfromxml(xmlstr.tostring(),notifyresdata. class );

         if (wxdata != null ){

           if ( "success" .equals(wxdata.getreturn_code())&& "success" .equals(wxdata.getresult_code())){

             orderpayinfo orderpayinfo = new orderpayinfo();

             orderpayinfo.setordernum(wxdata.getout_trade_no());

             orderpayinfo.setpaynum(wxdata.gettransaction_id());

             orderpayinfo.setpayprice(( double )wxdata.gettotal_fee()/ 100 + "" );

             orderpayinfo.setpaysource(wxdata.getopenid());

             orderpayinfo.setpaytime(wxdata.gettime_end());

             orderpayinfo.setpaytype( "2" ); //1支付宝,2 微信支付

             ordermessage returnmessage = orderproductserver

                 测试数据pleteproductorder(orderpayinfo);

             if (orderstatus.fail.equals(returnmessage

                 .getorderstatus())) {

               logger.getlogger(getclass()).error( "远程接口完成订单失败" );

               result= new weixinnotifyresult( "fail" );

               result.setreturn_msg( "远程接口完成订单失败" );

             } else {

               result= new weixinnotifyresult( "success" );

               result.setreturn_msg( "成功" );

             }

           } else {

             result= new weixinnotifyresult( "fail" );

             result.setreturn_msg( "失败" );

           }

         } else {

           result= new weixinnotifyresult( "fail" );

           result.setreturn_msg( "解析参数格式失败" );

         }

       } else {

         result= new weixinnotifyresult( "fail" );

         result.setreturn_msg( "签名失败" );

       }

       response.getwriter().write(result.tostring());

     } catch (exception e) {

       logger.getlogger(getclass()).error( "qlydweixinotify.do" , e);

       responedeal.getinstance().sendresponsestr(response, "404" , "连接超时" );

     } finally {

       if (out != null ) {

         out.close();

       }

     }

   }

模拟http请求工具类:

httpsrequestutil.java

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

package com.qlwb.weixin.util;

 

import java.io.ioexception;

 

import org.apache测试数据mons.httpclient.httpclient;

import org.apache测试数据mons.httpclient.httpexception;

import org.apache测试数据mons.httpclient.methods.postmethod;

import org.apache测试数据mons.httpclient.methods.requestentity;

import org.apache测试数据mons.httpclient.methods.stringrequestentity;

import org.apache.log4j.logger;

 

import com.qlwb.weixin测试数据mon.configure;

import com.qlwb.weixin测试数据mon.util;

import com.qlwb.weixin.protocol.pay_protocol.wxpayreqdata;

import com.qlwb.weixin.protocol.payquery_protocol.payqueryreqdata;

 

public class httpsrequestutil {

 

   /**

    *

    * @方法名称:sendwxpayrequest

    * @内容摘要: <发送统一下单请求>

    * @param body

    * @param outtradeno

    * @param totalfee

    * @param spbillcreateip

    * @return

    * string

    * @exception

    * @author:鹿伟伟

    * @创建日期:2016年2月19日-下午2:24:05

    */

   public string sendwxpayrequest(string body,string detail,string outtradeno, int totalfee,string spbillcreateip

       )

 

   {

     // 构造http请求

     httpclient httpclient = new httpclient();

 

     postmethod postmethod = new postmethod(configure.pay_api);

 

     wxpayreqdata wxdata = new wxpayreqdata(body,detail,outtradeno,totalfee,spbillcreateip);

 

     string requeststr= "" ;

     requeststr=util.convertobj2xml(wxdata);

     // 发送请求

     string strresponse = null ;

     try {

       requestentity entity = new stringrequestentity(

           requeststr.tostring(), "text/xml" , "utf-8" );

       postmethod.setrequestentity(entity);

       httpclient.executemethod(postmethod);

       strresponse = new string(postmethod.getresponsebody(), "utf-8" );

       logger.getlogger(getclass()).debug(strresponse);

     } catch (httpexception e) {

       logger.getlogger(getclass()).error( "sendwxpayrequest" , e);

     } catch (ioexception e) {

       logger.getlogger(getclass()).error( "sendwxpayrequest" , e);

     } finally {

       postmethod.releaseconnection();

     }

     return strresponse;

   }

   /**

    *

    * @方法名称:orderqueryrequest

    * @内容摘要: <查询订单信息>

    * @param transaction_id 微信的订单号,优先使用

    * @return

    * string

    * @exception

    * @author:鹿伟伟

    * @创建日期:2016年2月19日-下午2:44:11

    */

   public string orderqueryrequest(string transactionid, string outtradeno

       )

 

   {

     // 构造http请求

     httpclient httpclient = new httpclient();

 

     postmethod postmethod = new postmethod(configure.pay_query_api);

 

     payqueryreqdata wxdata = new payqueryreqdata(transactionid,outtradeno);

 

     string requeststr= "" ;

     requeststr=util.convertobj2xml(wxdata);

     // 发送请求

     string strresponse = null ;

     try {

       requestentity entity = new stringrequestentity(

           requeststr.tostring(), "text/xml" , "utf-8" );

       postmethod.setrequestentity(entity);

       httpclient.executemethod(postmethod);

       strresponse = new string(postmethod.getresponsebody(), "utf-8" );

 

     } catch (httpexception e) {

       logger.getlogger(getclass()).error( "orderqueryrequest" , e);

     } catch (ioexception e) {

       logger.getlogger(getclass()).error( "orderqueryrequest" , e);

     } finally {

       postmethod.releaseconnection();

     }

     return strresponse;

   }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

原文链接:https://blog.csdn.net/yelin042/article/details/80636540

查看更多关于java实现微信支付结果通知的详细内容...

  阅读:9次