一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術(shù)|正則表達(dá)式|

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - java服務(wù)端微信APP支付接口詳解

java服務(wù)端微信APP支付接口詳解

2020-09-20 14:21imLWY JAVA教程

這篇文章主要為大家詳細(xì)介紹了java服務(wù)端微信APP支付接口,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

一、微信APP支付接入商戶服務(wù)中心

[申請(qǐng)流程指引] (https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317780&token=84f23b4e9746c5963128711f225476cfd49ccf8c&lang=zh_CN)

二、開(kāi)始開(kāi)發(fā)

1、配置相關(guān)的配置信息

1.1、配置appid(Android)、mch_id(ios)、微信支付后的回調(diào)地址

?
1
2
3
4
5
6
7
sys.properties配置文件:
 
  appid=wx***************1
  mch_id=1********2
  notify_url=http://6*.***.***.**/returnmsg.do
 
//回調(diào)通知的地址,一定是要可以直接訪問(wèn)的地址

2、微信支付–下單

?
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
@ResponseBody
@RequestMapping(value = "/weixinpay.do", produces = "text/html;charset=UTF-8",method={RequestMethod.POST})
  public static String weixinpay(String body, //商品描述
      String detail, //商品詳情
      String attach, //附加數(shù)據(jù),在查詢API和支付通知中原樣返回,該字段主要用于商戶攜帶訂單的自定義數(shù)據(jù)
      String out_trade_no, //商戶系統(tǒng)內(nèi)部的訂單號(hào),32個(gè)字符內(nèi)、可包含字母, 其他說(shuō)明見(jiàn)商戶訂單號(hào)
      String total_price, //訂單總金額,單位為分,詳見(jiàn)支付金額
      String spbill_create_ip //用戶端實(shí)際ip
 
      ) throws Exception {
 
    WeixinConfigUtils config = new WeixinConfigUtils();
    //參數(shù)組
    String appid = config.appid;//微信開(kāi)放平臺(tái)審核通過(guò)的應(yīng)用APPID
    System.out.println("appid是:"+appid);
    String mch_id = config.mch_id;
    System.out.println("mch_id是:"+mch_id);
    String nonce_str = RandCharsUtils.getRandomString(16);
    System.out.println("隨機(jī)字符串是:"+nonce_str);
 
 
    body = body;//"測(cè)試微信支付0.01_2";
    detail = detail;//"0.01_元測(cè)試開(kāi)始";
    //attach = attach;//"備用參數(shù),先留著,后面會(huì)有用的";
    //String out_trade_no = OrderUtil.getOrderNo();//"2015112500001000811017342394";
 
    double totalfee =0;
    try{
      totalfee=Double.parseDouble(total_price);////單位是分,即是0.01元
    }catch (Exception e) {
      totalfee=0;
    }
    int total_fee=(int) (totalfee*100);
    spbill_create_ip = spbill_create_ip;//"127.0.0.1";
 
    String time_start = RandCharsUtils.timeStart();
    System.out.println(time_start);
    String time_expire = RandCharsUtils.timeExpire();
    System.out.println(time_expire);
    String notify_url = config.notify_url;
    System.out.println("notify_url是:"+notify_url);
    String trade_type = "APP";
 
    //參數(shù):開(kāi)始生成簽名
    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);
 
    String sign = WXSignUtils.createSign("UTF-8", parameters);
    System.out.println("簽名是:"+sign);
 
 
    Unifiedorder unifiedorder = new Unifiedorder();
    unifiedorder.setAppid(appid);
    unifiedorder.setMch_id(mch_id);
    unifiedorder.setNonce_str(nonce_str);
    unifiedorder.setSign(sign);
    unifiedorder.setBody(body);
    unifiedorder.setDetail(detail);
    unifiedorder.setAttach(attach);
    unifiedorder.setOut_trade_no(out_trade_no);
    unifiedorder.setTotal_fee(total_fee);
    unifiedorder.setSpbill_create_ip(spbill_create_ip);
    unifiedorder.setTime_start(time_start);
    unifiedorder.setTime_expire(time_expire);
    unifiedorder.setNotify_url(notify_url);
    unifiedorder.setTrade_type(trade_type);
 
    System.out.println(MD5Utils.md5("fenxiangzhuyi") + "========================");
 
    //構(gòu)造xml參數(shù)
    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();
 
    System.out.println(weixinPost);
 
    ParseXMLUtils.jdomParseXml(weixinPost);
 
 
 
    String json = JsonUtil.xml2jsonString(weixinPost);
 
    System.out.println("=========================================================");
 
    Bean b = JsonUtil.getSingleBean(json, Bean.class);
    if(null!=b){
      WeixinOrder weixin = b.getXml();
      //參數(shù):開(kāi)始生成簽名
      SortedMap<Object,Object> par = new TreeMap<Object,Object>();
      par.put("appid", weixin.getAppid());
      par.put("partnerid", weixin.getMch_id());
      par.put("prepayid", weixin.getPrepay_id());
      par.put("package", "Sign=WXPay");
      par.put("noncestr", weixin.getNonce_str());
 
      //時(shí)間戳
       Date date = new Date();
       long time = date.getTime();
       //mysq 時(shí)間戳只有10位 要做處理
       String dateline = time + "";
       dateline = dateline.substring(0, 10);
 
      par.put("timestamp", dateline);
 
      String signnew = WXSignUtils.createSign("UTF-8", par);
      System.out.println("再次簽名是:"+signnew);
 
 
      SetPay setPay = new SetPay();
 
      setPay.setAppid(weixin.getAppid());
      setPay.setPartnerid(weixin.getMch_id());
      setPay.setPrepayid(weixin.getPrepay_id());
      setPay.setNoncestr(weixin.getNonce_str());
 
      setPay.setTimestamp(dateline);
      setPay.setSign(signnew);
      setPay.setPack("Sign=WXPay");
 
      JSONObject js = JSONObject.fromObject(setPay);
      StringBuilder msg = new StringBuilder();
      msg.append("{\"code\":\"1\",");
      msg.append("\"msg\":\"查詢成功!\",");
      msg.append("\"datas\":");
      msg.append(js.toString());
      msg.append("}");
 
      System.out.println(js);
 
      return msg.toString();
    }
    StringBuilder msg = new StringBuilder();
    msg.append("{\"code\":\"1\",");
    msg.append("\"msg\":\"查詢成功!\",");
    msg.append("\"datas\":");
    msg.append("支付失敗!");
    msg.append("}");
 
 
    return msg.toString();
 
  }

2.1、微信支付簽名算法sign

?
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
package com.wx.weixincontroller.pay.weixin.Utils;
 
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
 
import com.wx.weixin.utils.MD5Utils;
 
/**
 * 微信支付簽名
 * @author iYjrg_xiebin
 * @date 2016年10月25日下午4:47:07
 */
public class WXSignUtils {
  //http://mch.weixin.qq.com/wiki/doc/api/index.php?chapter=4_3
  //商戶Key:改成公司申請(qǐng)的即可
  //32位密碼設(shè)置地址:http://www.sexauth.com/ jdex1hvufnm1sdcb0e81t36k0d0f15nc
 
  private static String Key = "***cb**e**ef**c*e*d***e*fd***cb*";
 
  /**
   * 微信支付簽名算法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();//所有參與傳參的參數(shù)按照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;
  }
 
}

2.2、POST提交XML格式的參數(shù)

?
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
package com.wx.weixincontroller.pay.weixin.Utils;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
 
import javax.net.ssl.HttpsURLConnection;
 
import com. com.wx.weixin.wxcontroller.pay.weixin.entity.Unifiedorder;
 
/**
 * post提交xml格式的參數(shù)
 * @author iYjrg_xiebin
 * @date 2016年10月25日下午3:33:38
 */
public class HttpXmlUtils {
 
  /**
   * 開(kāi)始post提交參數(shù)到接口
   * 并接受返回
   * @param url
   * @param xml
   * @param method
   * @param contentType
   * @return
   */
  public static String xmlHttpProxy(String url,String xml,String method,String contentType){
    InputStream is = null;
    OutputStreamWriter os = null;
 
    try {
      URL _url = new URL(url);
      HttpURLConnection conn = (HttpURLConnection) _url.openConnection();
      conn.setDoInput(true); 
      conn.setDoOutput(true); 
      conn.setRequestProperty("Content-type", "text/xml");
      conn.setRequestProperty("Pragma:", "no-cache");
      conn.setRequestProperty("Cache-Control", "no-cache");
      conn.setRequestMethod("POST");
      os = new OutputStreamWriter(conn.getOutputStream());
      os.write(new String(xml.getBytes(contentType)));
      os.flush();
 
      //返回值
      is = conn.getInputStream();
      return getContent(is, "utf-8");
    } catch (MalformedURLException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } finally{
      try {
        if(os!=null){os.close();}
        if(is!=null){is.close();}
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
    return null;
  }
 
  /**
   * 解析返回的值
   * @param is
   * @param charset
   * @return
   */
  public static String getContent(InputStream is, String charset) {
    String pageString = null;
    InputStreamReader isr = null;
    BufferedReader br = null;
    StringBuffer sb = null;
    try {
      isr = new InputStreamReader(is, charset);
      br = new BufferedReader(isr);
      sb = new StringBuffer();
      String line = null;
      while ((line = br.readLine()) != null) {
        sb.append(line + "\n");
      }
      pageString = sb.toString();
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      try {
        if (is != null){
          is.close();
        }
        if(isr!=null){
          isr.close();
        }
        if(br!=null){
          br.close();
        }
      } catch (IOException e) {
        e.printStackTrace();
      }
      sb = null;
    }
    return pageString;
  }
 
  /**
   * 構(gòu)造xml參數(shù)
   * @param xml
   * @return
   */
  public static String xmlInfo(Unifiedorder unifiedorder){
    //構(gòu)造xml參數(shù)的時(shí)候,至少又是個(gè)必傳參數(shù)
    /*
     * <xml>
        <appid>wx2421b1c4370ec43b</appid>
        <attach>支付測(cè)試</attach>
        <body>JSAPI支付測(cè)試</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 "";
  }
 
 
 
 
  /**
   * post請(qǐng)求并得到返回結(jié)果
   * @param requestUrl
   * @param requestMethod
   * @param output
   * @return
   */
  public static String httpsRequest(String requestUrl, String requestMethod, String output) {
    try{
      URL url = new URL(requestUrl);
      HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
      connection.setDoOutput(true);
      connection.setDoInput(true);
      connection.setUseCaches(false);
      connection.setRequestMethod(requestMethod);
      if (null != output) {
        OutputStream outputStream = connection.getOutputStream();
        outputStream.write(output.getBytes("UTF-8"));
        outputStream.close();
      }
      // 從輸入流讀取返回內(nèi)容
      InputStream inputStream = connection.getInputStream();
      InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
      BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
      String str = null;
      StringBuffer buffer = new StringBuffer();
      while ((str = bufferedReader.readLine()) != null) {
        buffer.append(str);
      }
      bufferedReader.close();
      inputStreamReader.close();
      inputStream.close();
      inputStream = null;
      connection.disconnect();
      return buffer.toString();
    }catch(Exception ex){
      ex.printStackTrace();
    }
 
    return "";
  }
 
}

3、微信支付–回調(diào)通知業(yè)務(wù)處理

?
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
//通知處理類(lèi)
@ResponseBody
@RequestMapping(value = "/returnmsg.do", produces = "text/html;charset=UTF-8",method={RequestMethod.POST})
   public String returnmsg(HttpServletRequest request, HttpServletResponse response) throws Exception {
 
     // 解析結(jié)果存儲(chǔ)在HashMap
     Map<String, String> map = new HashMap<String, String>();
     InputStream inputStream = request.getInputStream();
 
     // 讀取輸入流
     SAXReader reader = new SAXReader();
     Document document = reader.read(inputStream);
     // 得到xml根元素
     Element root = document.getRootElement();
     // 得到根元素的所有子節(jié)點(diǎn)
     List<Element> elementList = root.elements();
 
     // 遍歷所有子節(jié)點(diǎn)
     for (Element e : elementList) {
       map.put(e.getName(), e.getText());
     }
 
     JSONObject json = JSONObject.fromObject(map);
 
     System.out.println("===消息通知的結(jié)果:" + json.toString() + "==========================");
     System.out.println("===return_code===" + map.get("return_code"));
     System.out.println("===return_msg===" + map.get("return_msg"));
     System.out.println("===out_trade_no===" + map.get("out_trade_no"));
 
     //驗(yàn)證簽名的過(guò)程
 
     //判斷是否支付成功
     if(map.get("return_code").equals("SUCCESS")) {
 
         /**
         *支付成功之后的業(yè)務(wù)處理
         */
 
         // 釋放資源
         inputStream.close();
         inputStream = null;
 
 
         //bis.close();
         return "SUCCESS";
       }
 
     }
     if (map.get("return_code").equals("FAIL")) {
 
       /**
        *支付失敗后的業(yè)務(wù)處理
        */
 
         // 釋放資源
         inputStream.close();
 
         inputStream = null;
 
         return "SUCCESS";
       }
 
 
     }
 
     // 釋放資源
     inputStream.close();
     inputStream = null;
 
     return "SUCCESS";
 
   }

 

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩理论在线观看 | 国产欧美日韩免费一区二区 | 国产精品久久久久久影视 | 99资源在线观看 | 金牛网155755水心论坛黄大父母 | 九九久久精品 | 特级一级全黄毛片免费 | 国产普通话对白露脸流出 | 91碰碰| 涩涩国产精品福利在线观看 | 国产精品成人免费观看 | 欧美一区二区三区不卡视频 | 紧身牛仔裤美女被啪啪久久网 | 慢慢娇淫 | 亚洲午夜精品久久久久久人妖 | 亚洲2017久无码 | 无码一区二区三区视频 | 乌克兰精品摘花处破 | 久久综合色超碰人人 | 日韩精品欧美高清区 | 日本在线视频免费看 | 午夜亚洲福利 | 精品四虎国产在免费观看 | 亚洲网红精品大秀在线观看 | 亚洲男人第一天堂 | 国产小视频在线免费 | 亚洲第一综合天堂另类专 | 免费一看一级毛片人 | 日韩在线中文字幕 | 免费一级国产大片 | 午夜黄视频 | 亚洲免费国产 | xxxxxx日本处大片免费看 | 亚洲a视频在线 | 91精品国产综合久久福利 | 风间由美m3u8在线 | 国产欧美国产综合第一区 | 国产色司机在线视频免费观看 | 亚洲 日本 中文字幕 制服 | 国产福利一区二区三区四区 | 午夜福到在线2019 |