最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java服務(wù)器端微信、支付寶支付和退款功能

 更新時間:2018年09月29日 11:04:34   作者:居家?guī)浉? 
這篇文章主要為大家詳細(xì)介紹了java服務(wù)器端微信、支付寶支付和退款功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下

工作需要,寫了服務(wù)器端的支付和退款功能,包含微信和支付寶,網(wǎng)上也有很多demo可以借鑒,我把我的代碼放出來,寫的比較簡單,有問題的歡迎指正,大家一起學(xué)習(xí)。

微信支付需要調(diào)用微信的統(tǒng)一下單接口,而支付寶不用。

我寫的時候微信和支付寶都單獨寫了一個工具類,來調(diào)用支付,給前端返回需要的數(shù)據(jù)。

ps:支付是可以不需要服務(wù)器端的,不過為了安全一點點,所以前端需要調(diào)起支付的字段都直接從服務(wù)器端返回,前端拿到字段直接調(diào)起支付就可以了。

Map<String,String> map = new HashMap<String,String>();
switch (record.getCheckType()) {
 case 10:
 map = Alipay.prePay(record.getAmount(),out_trade_no);
 return ResponseData.ok(map);
 case 20:
 map = WXPay.prePay(record.getAmount(),out_trade_no);
 return ResponseData.ok(map);
}

10是支付寶支付,20是微信支付,map里存放前端需要的字段,直接返回給手機端

其中out_trade_no這個是商戶自己生成的唯一訂單號

public class WXPay {
 
 private static String url = String.format("https://api.mch.weixin.qq.com/pay/unifiedorder");
 
 //統(tǒng)一下單
 public static Map<String,String> prePay(BigDecimal amount,String out_trade_no){
 String entity = genProductArgs(amount,out_trade_no); 
 
 byte[] buf = Util.httpPost(url, entity);
 
 String content = new String(buf);
 Map<String,String> xml=decodeXml(content);
 return getRep(xml);
 }
 
 private static Map<String, String> getRep(Map<String, String> xml) {
 Random random = new Random();
 List<NameValuePair> signParams = new LinkedList<NameValuePair>();
 signParams.add(new BasicNameValuePair("appid", Constants.APP_ID_WX));
 signParams.add(new BasicNameValuePair("noncestr", MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes())));
// signParams.add(new BasicNameValuePair("package", "prepay_id="+xml.get("prepay_id")));
 signParams.add(new BasicNameValuePair("package", "Sign=WXPay"));
 signParams.add(new BasicNameValuePair("partnerid", Constants.MCH_ID));
 signParams.add(new BasicNameValuePair("prepayid", xml.get("prepay_id")));
 signParams.add(new BasicNameValuePair("timestamp", String.valueOf(System.currentTimeMillis() / 1000)));
 xml.put("sign", genPackageSign(signParams));
 for (int i = 0; i < signParams.size(); i++) {
  xml.put(signParams.get(i).getName(),signParams.get(i).getValue());
 }
 return removeElements(xml);
 }
 
 private static Map<String, String> removeElements(Map<String, String> xml) {
 xml.remove("appid");
 xml.remove("mch_id");
 xml.remove("nonce_str");
 xml.remove("trade_type");
 //xml.remove("partnerid");
 xml.remove("prepay_id");
 xml.remove("result_code");
 xml.remove("return_code");
 xml.remove("return_msg");
 return xml;
 }
 
 private static String genProductArgs(BigDecimal amount,String out_trade_no) {
 StringBuffer xml = new StringBuffer();
 
 String nonceStr = genNonceStr();
 
 xml.append("</xml>");
 List<NameValuePair> packageParams = new LinkedList<NameValuePair>();
 packageParams.add(new BasicNameValuePair("appid", Constants.APP_ID_WX));
 packageParams.add(new BasicNameValuePair("body", "APP pay test"));
 packageParams.add(new BasicNameValuePair("mch_id", Constants.MCH_ID));
 packageParams.add(new BasicNameValuePair("nonce_str", nonceStr));
 packageParams.add(new BasicNameValuePair("notify_url", "填寫服務(wù)器的支付回調(diào)路徑"));
 packageParams.add(new BasicNameValuePair("out_trade_no",out_trade_no)); 
 packageParams.add(new BasicNameValuePair("spbill_create_ip","127.0.0.1"));
 packageParams.add(new BasicNameValuePair("total_fee", String.valueOf(amount.movePointRight(2))));
// packageParams.add(new BasicNameValuePair("total_fee", "1"));
 packageParams.add(new BasicNameValuePair("trade_type", "APP"));
 
 String sign = genPackageSign(packageParams);
 packageParams.add(new BasicNameValuePair("sign", sign));
 
 
 String xmlstring =toXml(packageParams);
 return xmlstring;
 }
 
 public static String genNonceStr() {
 Random random = new Random();
 return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());
 }
 
 public static String genPackageSign(List<NameValuePair> params) {
 StringBuilder sb = new StringBuilder();
 
 for (int i = 0; i < params.size(); i++) {
  sb.append(params.get(i).getName());
  sb.append('=');
  sb.append(params.get(i).getValue());
  sb.append('&');
 }
 sb.append("key=");
 sb.append(Constants.API_KEY);
 
 
 String packageSign = MD5.getMessageDigest(sb.toString().getBytes()).toUpperCase();
 return packageSign;
 }
 
 public static String toXml(List<NameValuePair> params) {
 StringBuilder sb = new StringBuilder();
 sb.append("<xml>");
 for (int i = 0; i < params.size(); i++) {
  sb.append("<"+params.get(i).getName()+">");
 
 
  sb.append(params.get(i).getValue());
  sb.append("</"+params.get(i).getName()+">");
 }
 sb.append("</xml>");
 
 return sb.toString();
 }
 
}
public class Alipay {
 
 public static Map<String,String> prePay(BigDecimal payAbleAmount,String out_trade_no){
 //String orderInfo = getOrderInfo("訂單付款", "訂單付款",out_trade_no,"0.01");
 String orderInfo = getOrderInfo("訂單付款", "訂單付款",out_trade_no,String.valueOf(payAbleAmount));
 
 String sign = sign(orderInfo);
 
 try {
  /**
  * 僅需對sign 做URL編碼
  */
  sign = URLEncoder.encode(sign, "UTF-8");
 } catch (UnsupportedEncodingException e) {
  e.printStackTrace();
 }
 
 /**
  * 完整的符合支付寶參數(shù)規(guī)范的訂單信息
  */
 final String payInfo = orderInfo + "&sign=\"" + sign + "\"&" + getSignType();
 
 Map<String,String> map = new HashMap<String, String>();
 map.put("payInfo", payInfo);
 return map;
 }
 
 private static String getOrderInfo(String subject, String body,String out_trade_no,String price) {
 
 // 簽約合作者身份ID
 String orderInfo = "partner=" + "\"" + Constants.PARTNER + "\"";
 
 // 簽約賣家支付寶賬號
 orderInfo += "&seller_id=" + "\"" + Constants.SELLER + "\"";
 
 // 商戶網(wǎng)站唯一訂單號
 orderInfo += "&out_trade_no=" + "\"" + out_trade_no + "\"";
 
 // 商品名稱
 orderInfo += "&subject=" + "\"" + subject + "\"";
 
 // 商品詳情
 orderInfo += "&body=" + "\"" + body + "\"";
 
 // 商品金額
 orderInfo += "&total_fee=" + "\"" + price + "\"";
 
 // 服務(wù)器異步通知頁面路徑
 orderInfo += "¬ify_url=" + "\"" + "填寫服務(wù)器的支付回調(diào)路徑" + "\"";
 
 
 // 服務(wù)接口名稱, 固定值
 orderInfo += "&service=\"mobile.securitypay.pay\"";
 
 // 支付類型, 固定值
 orderInfo += "&payment_type=\"1\"";
 
 // 參數(shù)編碼, 固定值
 orderInfo += "&_input_charset=\"utf-8\"";
 
 // 設(shè)置未付款交易的超時時間
 // 默認(rèn)30分鐘,一旦超時,該筆交易就會自動被關(guān)閉。
 // 取值范圍:1m~15d。
 // m-分鐘,h-小時,d-天,1c-當(dāng)天(無論交易何時創(chuàng)建,都在0點關(guān)閉)。
 // 該參數(shù)數(shù)值不接受小數(shù)點,如1.5h,可轉(zhuǎn)換為90m。
 orderInfo += "&it_b_pay=\"30m\"";
 
 // extern_token為經(jīng)過快登授權(quán)獲取到的alipay_open_id,帶上此參數(shù)用戶將使用授權(quán)的賬戶進行支付
 // orderInfo += "&extern_token=" + "\"" + extern_token + "\"";
 
 // 支付寶處理完請求后,當(dāng)前頁面跳轉(zhuǎn)到商戶指定頁面的路徑,可空
 orderInfo += "&return_url=\"m.alipay.com\"";
 
 // 調(diào)用銀行卡支付,需配置此參數(shù),參與簽名, 固定值 (需要簽約《無線銀行卡快捷支付》才能使用)
 // orderInfo += "&paymethod=\"expressGateway\"";
 
 return orderInfo;
 }
 
 
 private static String sign(String content) {
 return SignUtils.sign(content, Constants.RSA_PRIVATE);
 }
 
 private static String getSignType() {
 return "sign_type=\"RSA\"";
 }
}

退款部分

支付寶

String strResponse = null;
AlipayTradeRefundResponse response = null;
try {
   AlipayClient alipayClient = new DefaultAlipayClient(url,Constants.APPID_ALIPAY,Constants.RSA_PRIVATE,"json","utf-8",Constants.RSA_PUBLIC);
   AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
      
   RefundInfo alidata = new RefundInfo();
   alidata.setOut_trade_no(out_trade_no);
   alidata.setRefund_amount(refund_amount);
      
   request.setBizContent(JSON.toJSONString(alidata));
      
    response = alipayClient.sdkExecute(request);
     if (response.isSuccess()) {
       strResponse="退款成功";
     } else {
     strResponse="退款失敗";
     }
      
      return strResponse;
    } catch (Exception e) {
     strResponse="退款出錯";
    }
return strResponse;

微信

public class WXRefund {
 private static final String url = "https://api.mch.weixin.qq.com/secapi/pay/refund";
 
 /**
 * 微信退款
 * @param out_trade_no 商戶訂單號
 * @param total_fee 總金額
 * @param refund_fee 退款金額
 * @return
 */
 public static String doRefund(String out_trade_no,int total_fee,int refund_fee) {
 
 InputStream instream = null;
 KeyStore keyStore = null;
 CloseableHttpResponse response = null;
 CloseableHttpClient httpclient = null;
 StringBuilder text = new StringBuilder();
 String key = Constants.MCH_ID;
 try {
  /**
  * 注意PKCS12證書 是從微信商戶平臺-》賬戶設(shè)置-》 API安全 中下載的
  */
  keyStore = KeyStore.getInstance("PKCS12");
  instream = WXRefund.class.getResourceAsStream("/apiclient_cert.p12");//P12文件
  
  
  /**
  * 此處要改
  */
  keyStore.load(instream, key.toCharArray());// 這里寫密碼..默認(rèn)是MCHID
  
  /**
  * 此處要改
  */
  SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, key.toCharArray())// 這里也是寫密碼的
  .build();
  // Allow TLSv1 protocol only
  SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
  httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
  
  //=======================證書配置完成========================
  
  
  HttpPost httpPost = new HttpPost(url);
  
  String xmlstring = getRefunArgs(out_trade_no,total_fee,refund_fee);
  
  
  
  httpPost.setEntity(new StringEntity(xmlstring));
  httpPost.setHeader("Accept", "application/json");
  httpPost.setHeader("Content-type", "application/json");
  
  response = httpclient.execute(httpPost);
  
  HttpEntity entity = response.getEntity();
  
  if (entity != null) {
  BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(entity.getContent()));
  
  String str;
  while ((str = bufferedReader.readLine()) != null) {
   text.append(str);
  }
  }
  EntityUtils.consume(entity);
 }catch(Exception e){
  
 }finally {
  if(instream != null){
  try {
   instream.close();
  } catch (IOException e) {
   e.printStackTrace();
  }
  }
  if(response != null){
  try {
   response.close();
  } catch (IOException e) {
   e.printStackTrace();
  }
  }
  
  if(httpclient != null){
  try {
   httpclient.close();
  } catch (IOException e) {
   e.printStackTrace();
  }
  }
 }
 Map<String,String> map = WXPay.decodeXml(text.toString());
 String return_msg = map.get("return_msg");
 if ("OK".equals(return_msg) && "SUCCESS".equals(map.get("return_code"))) {
  return "退款成功";
 }
 return return_msg;
 }
 
 //設(shè)置請求參數(shù)的值
 private static String getRefunArgs(String out_trade_no,int total_fee,int refund_fee) {
 String nonce_str = WXPay.genNonceStr();
 List<NameValuePair> packageParams = new LinkedList<NameValuePair>();
 packageParams.add(new BasicNameValuePair("appid", Constants.APP_ID_WX));
 packageParams.add(new BasicNameValuePair("mch_id", Constants.MCH_ID));
 packageParams.add(new BasicNameValuePair("nonce_str", nonce_str));
 packageParams.add(new BasicNameValuePair("op_user_id", Constants.MCH_ID));
 packageParams.add(new BasicNameValuePair("out_refund_no",out_trade_no));
 packageParams.add(new BasicNameValuePair("out_trade_no",out_trade_no));
 packageParams.add(new BasicNameValuePair("refund_fee", String.valueOf(refund_fee)));
 packageParams.add(new BasicNameValuePair("total_fee", String.valueOf(total_fee)));
 
 String sign = WXPay.genPackageSign(packageParams);
 packageParams.add(new BasicNameValuePair("sign", sign));
 
 
 return WXPay.toXml(packageParams);
 
 }
 
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解spring自動掃描包

    詳解spring自動掃描包

    這篇文章主要介紹了spring自動掃描包的相關(guān)知識,本文通過實例相結(jié)合的形式給大家介紹的非常詳細(xì),感興趣的朋友跟隨腳本之家小編一起看看吧
    2018-06-06
  • Java微信支付之公眾號支付、掃碼支付實例

    Java微信支付之公眾號支付、掃碼支付實例

    微信支付已經(jīng)成為生活中必不可少的付款方式,本篇文章主要介紹了Java微信支付之公眾號支付、掃碼支付,有需要的小伙伴可以了解一下。
    2016-11-11
  • JetBrains推出全新IDE之Fleet詳解

    JetBrains推出全新IDE之Fleet詳解

    當(dāng)您第一次啟動 Fleet 時,它會作為一個功能齊全的編輯器啟動,具有語法高亮顯示、簡單的代碼補全以及您對一個編輯器期待的所有功能,本文學(xué)習(xí)下JetBrains推出全新IDE之Fleet相關(guān)知識,感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • Java通過stmp協(xié)議發(fā)送郵件

    Java通過stmp協(xié)議發(fā)送郵件

    這篇文章主要為大家詳細(xì)介紹了Java通過stmp協(xié)議發(fā)送郵件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • Elasticsearch索引結(jié)構(gòu)與算法解析

    Elasticsearch索引結(jié)構(gòu)與算法解析

    ?作為搜索引擎的一部分,ES自然具有速度快、結(jié)果準(zhǔn)確、結(jié)果豐富等特點,那么ES是如何達(dá)到“搜索引擎”級別的查詢效率呢?首先是索引,其次是壓縮算法,接下來我們就一起了解下ES的索引結(jié)構(gòu)和壓縮算法
    2023-04-04
  • java基礎(chǔ)類型源碼解析之多角度講HashMap

    java基礎(chǔ)類型源碼解析之多角度講HashMap

    這篇文章主要給大家介紹了關(guān)于java基礎(chǔ)類型源碼解析之HashMap的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用java基具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 深入解析Java的Spring框架中的混合事務(wù)與bean的區(qū)分

    深入解析Java的Spring框架中的混合事務(wù)與bean的區(qū)分

    這篇文章主要介紹了Java的Spring框架中的混合事務(wù)與bean的區(qū)分,Spring是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2016-01-01
  • java IO流 之 輸入流 InputString()的使用

    java IO流 之 輸入流 InputString()的使用

    這篇文章主要介紹了java IO流 之 輸入流 InputString()的使用,以及讀取數(shù)據(jù)的三種方式詳解,非常不錯,需要的朋友可以參考下
    2016-12-12
  • 最有價值的50道java面試題 適用于準(zhǔn)入職Java程序員

    最有價值的50道java面試題 適用于準(zhǔn)入職Java程序員

    這篇文章主要為大家分享了最有價值的50道java面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,對hashCode方法的設(shè)計、垃圾收集的堆和代進行剖析,感興趣的小伙伴們可以參考一下
    2016-05-05
  • 測試環(huán)境頻繁Full GC問題的解決思路分析

    測試環(huán)境頻繁Full GC問題的解決思路分析

    全文介紹了作者通過與調(diào)用方交互,發(fā)現(xiàn)welink-front服務(wù)不可用的問題,通過jmap-heap和jstat-gccause命令,作者找到了問題的原因是元數(shù)據(jù)區(qū)內(nèi)存使用率過高,觸發(fā)了FullGC,作者通過分析GC日志和堆內(nèi)存使用情況,確定了問題的根本原因
    2025-01-01

最新評論

华亭县| 谢通门县| 扬中市| 莆田市| 博野县| 大同县| 青铜峡市| 囊谦县| 海门市| 罗田县| 盐边县| 吉水县| 定安县| 图片| 通州区| 黄冈市| 晴隆县| 精河县| 广河县| 平塘县| 台安县| 巴中市| 昌平区| 宣城市| 双桥区| 富源县| 伽师县| 北海市| 寿宁县| 孟连| 洱源县| 剑阁县| 潞城市| 鄂州市| 山西省| 民和| 樟树市| 西峡县| 汉沽区| 牡丹江市| 平顺县|