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

首頁 > 編程 > Java > 正文

微信公眾號支付(二)實現統一下單接口

2019-11-26 15:00:08
字體:
來源:轉載
供稿:網友

上一篇已經獲取到了用戶的OpenId

這篇主要是調用微信公眾支付的統一下單API

API地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1

看文檔,主要流程就是把20個左右的參數封裝為XML格式發送到微信給的接口地址,然后就可以獲取到返回的內容了,如果成功里面就有支付所需要的預支付ID

請求參數就不解釋了。

其中,隨機字符串:我用的是UUID去中劃線

 public static String create_nonce_str() { return UUID.randomUUID().toString().replace("-",""); }

商戶訂單號:每個訂單號只能使用一次,所以用的是系統的訂單號加的時間戳。

總金額:不能為

通知地址:微信支付成功或失敗回調給系統的地址

簽名:

import java.io.Serializable; public class PayInfo implements Serializable{ private static final long serialVersionUID = L; private String appid; private String mch_id; private String device_info; private String nonce_str; private String sign; private String body; private String attach; private String out_trade_no; private int total_fee; private String spbill_create_ip; private String notify_url; private String trade_type; private String openid; //下面是get,set方法  } /** * 創建統一下單的xml的java對象 * @param bizOrder 系統中的業務單號 * @param ip 用戶的ip地址 * @param openId 用戶的openId * @return */ public PayInfo createPayInfo(BizOrder bizOrder,String ip,String openId) {  PayInfo payInfo = new PayInfo();  payInfo.setAppid(Constants.appid);  payInfo.setDevice_info("WEB");  payInfo.setMch_id(Constants.mch_id);  payInfo.setNonce_str(CommonUtil.create_nonce_str().replace("-", ""));  payInfo.setBody("這里是某某白米飯的body");  payInfo.setAttach(bizOrder.getId());  payInfo.setOut_trade_no(bizOrder.getOrderCode().concat("A").concat(DateFormatUtils.format(new Date(), "MMddHHmmss")));  payInfo.setTotal_fee((int)bizOrder.getFeeAmount());  payInfo.setSpbill_create_ip(ip);  payInfo.setNotify_url(Constants.notify_url);  payInfo.setTrade_type("JSAPI");  payInfo.setOpenid(openId);  return payInfo; }

獲取簽名:

/** * 獲取簽名 * @param payInfo * @return * @throws Exception */ public String getSign(PayInfo payInfo) throws Exception {  String signTemp = "appid="+payInfo.getAppid()   +"&attach="+payInfo.getAttach()   +"&body="+payInfo.getBody()   +"&device_info="+payInfo.getDevice_info()   +"&mch_id="+payInfo.getMch_id()   +"&nonce_str="+payInfo.getNonce_str()   +"¬ify_url="+payInfo.getNotify_url()   +"&openid="+payInfo.getOpenid()   +"&out_trade_no="+payInfo.getOut_trade_no()   +"&spbill_create_ip="+payInfo.getSpbill_create_ip()   +"&total_fee="+payInfo.getTotal_fee()   +"&trade_type="+payInfo.getTrade_type()   +"&key="+Constants.key; //這個key注意 MessageDigest md = MessageDigest.getInstance("MD"); md.reset(); md.update(signTemp.getBytes("UTF-")); String sign = CommonUtil.byteToStr(md.digest()).toUpperCase(); return sign; }

注意:上面的Constants.key取值在商戶號API安全的API密鑰中。

一些工具方法:獲取ip地址,將字節數組轉換為十六進制字符串,將字節轉換為十六進制字符串

 /** * 將字節數組轉換為十六進制字符串 *  * @param byteArray * @return */ public static String byteToStr(byte[] byteArray) {  String strDigest = "";  for (int i = ; i < byteArray.length; i++) {  strDigest += byteToHexStr(byteArray[i]);  }  return strDigest; } /** * 將字節轉換為十六進制字符串 *  * @param btyes * @return */ public static String byteToHexStr(byte bytes) {  char[] Digit = { '', '', '', '', '', '', '', '', '', '', 'A', 'B', 'C', 'D', 'E', 'F' };  char[] tempArr = new char[];  tempArr[] = Digit[(bytes >>> ) & XF];  tempArr[] = Digit[bytes & XF];  String s = new String(tempArr);  return s; } /** * 獲取ip地址 * @param request * @return */ public static String getIpAddr(HttpServletRequest request) {   InetAddress addr = null;   try {   addr = InetAddress.getLocalHost();   } catch (UnknownHostException e) {   return request.getRemoteAddr();   }   byte[] ipAddr = addr.getAddress();   String ipAddrStr = "";   for (int i = ; i < ipAddr.length; i++) {   if (i > ) {    ipAddrStr += ".";   }   ipAddrStr += ipAddr[i] & xFF;   }   return ipAddrStr;  } 

這樣就獲取了簽名,把簽名與PayInfo中的其他數據轉成XML格式,當做參數傳遞給統一下單地址。

 PayInfo pi = pu.createPayInfo(bo,"...",""); String sign = pu.getSign(pi); pi.setSign(sign);

對象轉XML

 /** * 擴展xstream使其支持CDATA */ private static XStream xstream = new XStream(new XppDriver() {  public HierarchicalStreamWriter createWriter(Writer out) {  return new PrettyPrintWriter(out) {   //增加CDATA標記   boolean cdata = true;   @SuppressWarnings("rawtypes")   public void startNode(String name, Class clazz) {   super.startNode(name, clazz);   }   protected void writeText(QuickWriter writer, String text) {   if (cdata) {    writer.write("<![CDATA[");    writer.write(text);    writer.write("]]>");   } else {    writer.write(text);   }   }  };  } }); public static String payInfoToXML(PayInfo pi) {  xstream.alias("xml", pi.getClass());  return xstream.toXML(pi); }

xml轉Map

 @SuppressWarnings("unchecked") public static Map<String, String> parseXml(String xml) throws Exception {  Map<String, String> map = new HashMap<String, String>();  Document document = DocumentHelper.parseText(xml);  Element root = document.getRootElement();  List<Element> elementList = root.elements();  for (Element e : elementList)  map.put(e.getName(), e.getText());  return map; }

下面就是調用統一下單的URL了

log.info(MessageUtil.payInfoToXML(pi).replace("__", "_"));   Map<String, String> map = CommonUtil.httpsRequestToXML("https://api.mch.weixin.qq.com/pay/unifiedorder", "POST", MessageUtil.payInfoToXML(pi).replace("__", "_").replace("<![CDATA[", "").replace("]]>", "")); log.info(map); public static Map<String, String> httpsRequestToXML(String requestUrl, String requestMethod, String outputStr) {  Map<String, String> result = new HashMap<>();  try {  StringBuffer buffer = httpsRequest(requestUrl, requestMethod, outputStr);  result = MessageUtil.parseXml(buffer.toString());  } catch (ConnectException ce) {  log.error("連接超時:"+ce.getMessage());  } catch (Exception e) {  log.error("https請求異常:"+ece.getMessage());  }  return result; }

httpsRequest()這個方法在第一篇中

上面獲取到的Map如果成功的話,里面就會有

String return_code = map.get("return_code"); if(StringUtils.isNotBlank(return_code) && return_code.equals("SUCCESS")){   String return_msg = map.get("return_msg"); if(StringUtils.isNotBlank(return_msg) && !return_msg.equals("OK")) {   return "統一下單錯誤!"; } }else{   return "統一下單錯誤!"; } String prepay_Id = map.get("prepay_id");

這個prepay_id就是預支付的ID。后面支付需要它。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美综合图区| 日韩免费电影在线观看| 日韩欧美第一页| 亚洲国产女人aaa毛片在线| 国产精品久久久久久一区二区| 欧洲永久精品大片ww免费漫画| 亚洲精品一区二区网址| 欧美寡妇偷汉性猛交| 久久久久免费精品国产| 亚洲国产精品免费| 久久久久久国产精品三级玉女聊斋| 成人免费高清完整版在线观看| 久久久久久久久久久av| 国产在线视频2019最新视频| 亚洲欧美激情在线视频| 亚洲第一精品久久忘忧草社区| 国产视频亚洲视频| 91极品视频在线| 亚洲国产精品热久久| 九九热99久久久国产盗摄| 久久精品91久久久久久再现| 在线观看精品国产视频| 欧美亚洲在线观看| 另类天堂视频在线观看| 国产精品视频白浆免费视频| xxxx欧美18另类的高清| 日韩电影免费观看中文字幕| 国产精品手机播放| 亚洲激情成人网| 中日韩午夜理伦电影免费| 日韩av一区二区在线观看| 日韩亚洲国产中文字幕| 国产香蕉精品视频一区二区三区| 欧美做受高潮电影o| 在线电影av不卡网址| 欧美又大又硬又粗bbbbb| www欧美日韩| 久久这里只有精品视频首页| 国产精品日韩av| 激情久久av一区av二区av三区| 精品美女久久久久久免费| 欧美激情日韩图片| 在线视频欧美性高潮| 岛国av一区二区| 久久乐国产精品| 亚洲一区二区中文| 欧美日韩福利在线观看| 亚洲国产成人精品女人久久久| 精品亚洲一区二区三区| 久久伊人精品视频| 国产精品白嫩美女在线观看| 欧美日韩国产精品一区二区不卡中文| 亚洲国产天堂久久国产91| 亲爱的老师9免费观看全集电视剧| 国产精品视频精品视频| 成人黄色午夜影院| 伊人伊人伊人久久| 奇门遁甲1982国语版免费观看高清| 精品五月天久久| 一区二区三区美女xx视频| 5566日本婷婷色中文字幕97| 日韩精品在线观看一区| 亚洲国产精品网站| 亚洲福利影片在线| 亚洲欧美日韩另类| 亚洲综合视频1区| 国产91色在线播放| 亚洲天堂男人天堂女人天堂| 国产精品久久久久久久久久免费| 国产精品爽爽爽爽爽爽在线观看| 精品国产老师黑色丝袜高跟鞋| 国产日韩视频在线观看| 亚洲精品视频免费| 中文字幕欧美精品日韩中文字幕| 国产经典一区二区| 一个人看的www久久| 色琪琪综合男人的天堂aⅴ视频| 欧美成人亚洲成人| 亚洲色图偷窥自拍| 操人视频在线观看欧美| 亚洲新声在线观看| 国产精品日本精品| 亚洲欧美精品一区二区| 国产精品久久久久高潮| 欧美日韩在线观看视频小说| 欧美激情亚洲综合一区| 国产精品久久久久久网站| 欧美日产国产成人免费图片| 亚洲天堂男人的天堂| 亚洲天堂精品在线| 色99之美女主播在线视频| 亚洲欧美精品一区二区| 成人精品网站在线观看| www.欧美三级电影.com| 精品福利在线观看| 日韩禁在线播放| 欧美成人精品一区二区| 国产精品高潮呻吟视频| 久久天天躁日日躁| 中文字幕欧美日韩| 亚洲精品理论电影| 欧美伊久线香蕉线新在线| 午夜精品三级视频福利| 欧美中文字幕视频在线观看| 欧美最顶级丰满的aⅴ艳星| 久久久精品一区| 米奇精品一区二区三区在线观看| 久久久久999| 亚洲va欧美va在线观看| 韩剧1988免费观看全集| 色妞久久福利网| 亚洲人成网站777色婷婷| 亚洲大尺度美女在线| 精品欧美aⅴ在线网站| 欧美激情精品久久久久久久变态| 久久久av电影| 日韩欧中文字幕| 国产成人高清激情视频在线观看| 国产精品爽爽爽爽爽爽在线观看| 日韩欧美极品在线观看| 国产专区欧美专区| 亚洲精品国产免费| 精品久久久久久中文字幕| 欧美性猛交视频| 欧美限制级电影在线观看| 最近2019免费中文字幕视频三| 久久久久九九九九| 欧美丰满老妇厨房牲生活| 亚洲欧美日韩中文在线| 欧美一级淫片aaaaaaa视频| 亚洲日本成人女熟在线观看| 毛片精品免费在线观看| 久久精品久久精品亚洲人| 亚洲的天堂在线中文字幕| 欧美人与性动交a欧美精品| 亚洲一级片在线看| 日韩高清欧美高清| 亚洲一二在线观看| 7777免费精品视频| 国产精品日韩欧美大师| 亚洲成人精品久久| 91精品国产亚洲| 久久精品91久久香蕉加勒比| 亚洲天堂网站在线观看视频| 精品久久久在线观看| 日韩综合视频在线观看| 久久综合色88| 7m第一福利500精品视频| 久久99久久99精品中文字幕| 午夜免费在线观看精品视频| 91亚洲精华国产精华| 亚洲女人被黑人巨大进入| 欧美亚洲第一区| 亚洲女人天堂视频| 久久久噜噜噜久久中文字免| 性欧美办公室18xxxxhd| 亚洲精品综合久久中文字幕| 一区二区在线免费视频| 亚洲深夜福利在线| 亚洲专区国产精品| 91精品视频免费| 欧美与黑人午夜性猛交久久久| 亚洲iv一区二区三区| 51精品国产黑色丝袜高跟鞋|