亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

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

2024-07-14 08:42:26
字體:
來源:轉載
供稿:網友

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

微信支付需要調用微信的統一下單接口,而支付寶不用。

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

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

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");  //統一下單 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", "填寫服務器的支付回調路徑")); 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(); }  /**  * 完整的符合支付寶參數規范的訂單信息  */ 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 + "/"";  // 商戶網站唯一訂單號 orderInfo += "&out_trade_no=" + "/"" + out_trade_no + "/"";  // 商品名稱 orderInfo += "&subject=" + "/"" + subject + "/"";  // 商品詳情 orderInfo += "&body=" + "/"" + body + "/"";  // 商品金額 orderInfo += "&total_fee=" + "/"" + price + "/"";  // 服務器異步通知頁面路徑 orderInfo += "¬ify_url=" + "/"" + "填寫服務器的支付回調路徑" + "/"";   // 服務接口名稱, 固定值 orderInfo += "&service=/"mobile.securitypay.pay/"";  // 支付類型, 固定值 orderInfo += "&payment_type=/"1/"";  // 參數編碼, 固定值 orderInfo += "&_input_charset=/"utf-8/"";  // 設置未付款交易的超時時間 // 默認30分鐘,一旦超時,該筆交易就會自動被關閉。 // 取值范圍:1m~15d。 // m-分鐘,h-小時,d-天,1c-當天(無論交易何時創建,都在0點關閉)。 // 該參數數值不接受小數點,如1.5h,可轉換為90m。 orderInfo += "&it_b_pay=/"30m/"";  // extern_token為經過快登授權獲取到的alipay_open_id,帶上此參數用戶將使用授權的賬戶進行支付 // orderInfo += "&extern_token=" + "/"" + extern_token + "/"";  // 支付寶處理完請求后,當前頁面跳轉到商戶指定頁面的路徑,可空 orderInfo += "&return_url=/"m.alipay.com/"";  // 調用銀行卡支付,需配置此參數,參與簽名, 固定值 (需要簽約《無線銀行卡快捷支付》才能使用) // 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證書 是從微信商戶平臺-》賬戶設置-》 API安全 中下載的  */  keyStore = KeyStore.getInstance("PKCS12");  instream = WXRefund.class.getResourceAsStream("/apiclient_cert.p12");//P12文件      /**  * 此處要改  */  keyStore.load(instream, key.toCharArray());// 這里寫密碼..默認是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; }  //設置請求參數的值 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);  } }

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人精品网站| 国产精品色婷婷视频| 午夜精品久久久久久久99黑人| 免费91麻豆精品国产自产在线观看| 日韩在线视频导航| 亚洲性夜色噜噜噜7777| 午夜精品福利电影| 欧美日韩国产精品专区| 最近2019年好看中文字幕视频| 欧美在线视频一区二区| 日本精品视频在线观看| 亚洲人成网站999久久久综合| 亚洲精品久久久久| 国产做受69高潮| 91理论片午午论夜理片久久| www.久久草.com| 欧美国产激情18| 亚洲最大的网站| 亚洲风情亚aⅴ在线发布| 成人欧美一区二区三区在线| 亚洲美女免费精品视频在线观看| 中文字幕亚洲无线码在线一区| 久久久成人的性感天堂| 国产99久久精品一区二区 夜夜躁日日躁| 国产视频亚洲视频| 日韩视频一区在线| 欧美高清不卡在线| 中文字幕日韩av综合精品| 久热在线中文字幕色999舞| 国产一区二区精品丝袜| 久久久久久网站| 国产精品免费视频xxxx| 久久久免费观看视频| 中文字幕在线亚洲| 久久视频在线直播| 国产欧美精品日韩精品| 国产精品入口免费视| 国产精品电影观看| 91在线精品播放| 午夜剧场成人观在线视频免费观看| 日韩一区在线视频| 日韩欧美一区二区三区| 亚洲人成伊人成综合网久久久| 日韩精品在线视频美女| 91久久夜色精品国产网站| 中文字幕少妇一区二区三区| 精品国产自在精品国产浪潮| 97在线精品国自产拍中文| 亚洲成人av片| 国产精品免费网站| 2019亚洲日韩新视频| 欧美日韩在线另类| 国产精品视频久久| 丝袜亚洲另类欧美重口| 亚洲精品国产精品久久清纯直播| 亚洲自拍偷拍色图| 疯狂欧美牲乱大交777| 欧美成人午夜免费视在线看片| 亚洲福利视频二区| 成人激情在线播放| 97视频在线观看免费| 秋霞午夜一区二区| xxxxx成人.com| 国产区亚洲区欧美区| 日韩在线视频免费观看高清中文| 日韩av影视综合网| 亚洲综合在线小说| 国产亚洲激情视频在线| 欧美视频第一页| 亚洲另类xxxx| 国产亚洲精品美女久久久久| 精品无人区太爽高潮在线播放| 亚洲激情视频在线播放| 中文字幕一精品亚洲无线一区| 九九精品在线视频| 国产精品旅馆在线| 成人妇女淫片aaaa视频| 久久免费在线观看| 日韩欧美中文免费| 欧美亚洲在线视频| 久久久久久中文| 国产精品久久久久久久久久久久久久| 久久97精品久久久久久久不卡| 久99久在线视频| 久久91亚洲精品中文字幕奶水| 在线视频欧美日韩精品| 成人黄色在线免费| 国模精品系列视频| 久热精品视频在线免费观看| 欧美日韩在线视频首页| 亚洲人成免费电影| 精品呦交小u女在线| 狠狠色噜噜狠狠狠狠97| 国产成人免费av| 欧美精品第一页在线播放| 欧美成人免费在线视频| 精品亚洲一区二区三区| 伊人伊成久久人综合网小说| 亚洲www在线| 国产成人aa精品一区在线播放| 中文字幕在线日韩| 国产成人综合av| 午夜精品一区二区三区av| 欧美成人午夜剧场免费观看| 亚洲人成在线观| 国产精自产拍久久久久久蜜| 国产精品美女无圣光视频| 国产精品视频在线观看| 91精品国产高清自在线看超| 亚洲国产免费av| 国产精品久久久久7777婷婷| 国内精品久久久久久久久| 国产亚洲福利一区| 激情亚洲一区二区三区四区| 亚洲黄色www| 亚洲成人激情在线| 91黑丝在线观看| 国产va免费精品高清在线观看| 亚洲free性xxxx护士白浆| 中文字幕精品网| 成人网在线视频| 欧美亚洲一级片| 中文字幕成人在线| 久久夜色撩人精品| 国产精品一香蕉国产线看观看| 欧美精品一区三区| 亚洲欧美制服丝袜| 91中文在线视频| 久久综合伊人77777蜜臀| 久久69精品久久久久久久电影好| 日韩av免费在线播放| 国产精品久久国产精品99gif| 中文字幕日韩专区| 97视频在线观看视频免费视频| 欧美夫妻性视频| 美女久久久久久久久久久| 国产精品久久久久久超碰| 精品一区电影国产| 精品国产精品三级精品av网址| 久久久久久久久久av| 日本精品一区二区三区在线播放视频| 亚洲成人免费在线视频| 日韩成人av网址| 欧美一区二粉嫩精品国产一线天| 国产精品va在线播放| 69久久夜色精品国产7777| 精品国产一区二区三区久久久| 日韩中文字幕在线精品| 国自在线精品视频| 一区二区成人精品| 国产精品自在线| 亚洲精品影视在线观看| 亚州av一区二区| 91欧美精品午夜性色福利在线| 视频一区视频二区国产精品| 91亚洲一区精品| 亚洲天堂2020| 中文字幕亚洲一区在线观看| 一区二区欧美在线| 欧美亚洲国产成人精品| 久久亚洲电影天堂| 日韩欧美在线网址| 国产精品麻豆va在线播放| 日韩欧美国产一区二区|