java实现网站微信扫码支付

一、网站微信扫码支付开发并没有现成的java示例,总结一下自己微信扫码支付心得

二、首先去微信公众平台申请账户

https://mp.weixin.qq.com
**

三、账户开通、开发者认证之后就可以进行微信支付开发了

1、微信统一下单接口调用获取预支付id,以及生成二维码所需的codeUrl

/**
 * 保存订单,并生成二维码所需的codeUrl
 *
 * @param request
 * @param response
 * @param notifyURLBuf
 * @param order
 * @return
 * @throws Exception
 */
 @Override
 public Map<String, String> getWechatOrderInfo(String ip, Cuser user, String notifyUrl, Order order) throws Exception {
 Map<String, String> resultMap = new HashMap<String, String>();
 // 生成并保存订单
 order.setUserId(user.getId());
 // 支付方式 0:银联 1:支付宝 2:网上银行 3:微信 4:其他
 order.setPayType("3");
 // 生成订单号
 order.setOrderNo(OrderNoGenerator.getOrderNo());
 // 订单类型 1:消费 2:退款
 order.setOrderType("1");
 // 订单创建时间
 order.setCreateTime(new Date());
 // 订单更新时间
 order.setUpdateTime(new Date());
 // 订单状态 0: 交易中 1:完成 2:已取消
 order.setOrderStatus("0");
 // 付款状态 0:失败 1:成功 2、待付款
 order.setPayStatus("2");
 // 设置订单失效时间
 Calendar calendar = Calendar.getInstance();
 calendar.add(Calendar.HOUR, 2);
 order.setExpireTime(calendar.getTime());
 Integer orderId = this.balanceDao.saveOrder(order);

 Map<String, String> payPreIdMap = new HashMap<>();
 payPreIdMap = WechatUtil.getPayPreId(String.valueOf(orderId), "体检报告", notifyUrl, ip,
  String.valueOf((order.getMoney().multiply(new BigDecimal(100)).intValue())), orderId.toString());
 String prePayId = payPreIdMap.get("prepay_id");
 // 更新
 order.setId(orderId);
 order.setPrepayId(prePayId);
 order.setCodeUrl(payPreIdMap.get("code_url"));
 this.balanceDao.updateOrder(order);
 // return WechatUtil.QRfromGoogle(order.getCodeUrl(), 300, 0);
 resultMap.put("codeUrl", order.getCodeUrl());
 resultMap.put("orderId", String.valueOf(order.getId()));
 return resultMap;
 }

此方法返回的数据如下

<xml><return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<appid><![CDATA[wxaf0b*****8afbf]]></appid>
<mch_id><![CDATA[1408****02]]></mch_id>
<nonce_str><![CDATA[zf0vGvdtVycBliwB]]></nonce_str>
<sign><![CDATA[A2910F16086211153D747058063B3368]]></sign>
<result_code><![CDATA[SUCCESS]]></result_code>
<prepay_id><![CDATA[wx201701191109388037e9a12310276591827]]></prepay_id>
<trade_type><![CDATA[NATIVE]]></trade_type>
<code_url><![CDATA[weixin://wxpay/bizpayurl?pr=1UjorNX]]></code_url>
</xml>

2、服务器端接受微信支付结果通知

/**
  * 保存微信通知结果
  *
  * @param request
  * @param response
  * @return
  * @throws Exception
  */
 @Override
 public String saveWechatNotify(String notifyInfoXml) throws Exception {
  Map<String, String> noticeMap = XMLUtil.doXMLParse(notifyInfoXml);
  // 这个其实是订单 的id
  String outTradeNo = noticeMap.get("out_trade_no");
  Order order = this.balanceDao.getOrderById(Integer.valueOf(outTradeNo));
  // 如果支付通知信息不为,说明请求已经处理过,直接返回
  if (StringUtil.isNotEmpty(order.getNotifyInfo())) {
   return "SUCCESS";
  }
  String sign = noticeMap.get("sign");
  noticeMap.remove("sign");
  // 验签通过
  if (WechatUtil.getSignVeryfy(noticeMap, sign)) {
   // 通信成功此字段是通信标识,非交易标识,交易是否成功需要查看result_code来判断
   if ("SUCCESS".equals(noticeMap.get("return_code"))) {
    // 交易成功
    if ("SUCCESS".equals(noticeMap.get("result_code"))) {
     // 商户订单号

     // 订单更新时间
     order.setUpdateTime(new Date());
     // ------------------------------
     // 处理业务开始
     // ------------------------------
     // 是否交易成功,1:成功0:失败
     // 微信支付成功
     order.setPayStatus("1");
     // 订单状态 0: 交易中 1:完成 2:已取消
     order.setOrderStatus("1");
     // 保存通知信息
     order.setNotifyInfo(notifyInfoXml);
     this.balanceDao.updateOrder(order);
     // 处理业务完毕
    } else {
     // 错误时,返回结果未签名,记录retcode、retmsg看失败详情。
     logger.info("查询验证签名失败或业务错误");
     logger.info("retcode:" + noticeMap.get("retcode") + " retmsg:" + noticeMap.get("retmsg"));
    }
    return "SUCCESS";
   } else {
    logger.info("后台调用通信失败");
   }
   return "SUCCESS";
  } else {
   logger.info("通知签名验证失败");
  }
  return null;
 }

3、上面代码用到的工具方法都在WechatUtil.java工具类中

package com.caifu.tencent.common;

import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Random;

import org.apache.commons.httpclient.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.jdom2.JDOMException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.caifu.login.utils.XMLUtil;

public class WechatUtil {

 private static Logger logger = LoggerFactory.getLogger(WechatUtil.class);
 public static final String TAG = "Wechat.Util";
 private static final int timeout = 5000;

 public static byte[] httpPost(String url, String entity) throws URISyntaxException, IOException {
  if (url == null || url.length() == 0) {
   logger.info(TAG, "httpPost, url is null");
   return null;
  }
  CloseableHttpClient httpClient = HttpClients.createDefault();
  URIBuilder uriBuilder = new URIBuilder(url);
  HttpPost httpPost = new HttpPost(uriBuilder.build());
  RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(timeout).setConnectionRequestTimeout(timeout).setConnectTimeout(timeout).build();
  httpPost.setConfig(requestConfig);
  // 避免汉字乱码导致请求失败,
  httpPost.setEntity(new StringEntity(entity, "UTF-8"));
  CloseableHttpResponse resp = null;
  try {
   resp = httpClient.execute(httpPost);
   if (resp.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
    logger.info(TAG, "httpGet fail, status code = " + resp.getStatusLine().getStatusCode());
    return null;
   }
   return EntityUtils.toByteArray(resp.getEntity());
  } catch (Exception e) {
   logger.info(TAG, "httpPost exception, e = " + e.getMessage());
   e.printStackTrace();
   return null;
  } finally {
   if (httpClient != null) {
    httpClient.close();
   }
   if (resp != null) {
    resp.close();
   }
  }
 }

 /**
  * 把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串
  *
  * @param params
  *   需要排序并参与字符拼接的参数组
  * @return 拼接后字符串
  */
 public static String createLinkString(Map<String, String> params) {

  List<String> keys = new ArrayList<String>(params.keySet());
  Collections.sort(keys);

  String prestr = "";

  for (int i = 0; i < keys.size(); i++) {
   String key = keys.get(i);
   String value = params.get(key);

   if (i == keys.size() - 1) {// 拼接时,不包括最后一个&字符
    prestr = prestr + key + "=" + value;
   } else {
    prestr = prestr + key + "=" + value + "&";
   }
  }

  return prestr;
 }

 /**
  * 根据反馈回来的信息,生成签名结果
  *
  * @param Params
  *   通知返回来的参数数组
  * @param sign
  *   比对的签名结果
  * @return 生成的签名结果
  */
 public static boolean getSignVeryfy(Map<String, String> Params, String sign) {
  // 过滤空值、sign与sign_type参数
  // Map<String, String> sParaNew = AlipayCore.paraFilter(Params);
  // 获取待签名字符串
  String preSignStr = createLinkString(Params);
  preSignStr += "&key=" + Configure.getKey();
  // 获得签名验证结果
  String resultSign = MD5.MD5Encode(preSignStr).toUpperCase();
  // String resultSign = MD5Util.MD5Encode(preSignStr.toString(),
  // "UTF-8").toLowerCase();
  if (sign.equals(resultSign)) {
   return true;
  } else {
   return false;
  }
 }

 /**
  * 装配xml,生成请求prePayId所需参数
  *
  * @param params
  * @return
  */
 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 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(Configure.getKey());
  String packageSign = MD5.MD5Encode(sb.toString());
  return packageSign;
 }

 /**
  *
  * @param goodOrderNo
  * @param body
  * @param noticeUrl
  * @param ip
  * @param totalFee
  * @return
  */
 public static String genProductArgs(String goodOrderNo, String body, String noticeUrl, String ip, String totalFee, String productId) {
  StringBuffer xml = new StringBuffer();
  try {
   String nonceStr = getNonceStr();
   xml.append("</xml>");
   List<NameValuePair> packageParams = new LinkedList<NameValuePair>();
   packageParams.add(new BasicNameValuePair("appid", Configure.getAppid()));
   packageParams.add(new BasicNameValuePair("body", body));
   packageParams.add(new BasicNameValuePair("mch_id", Configure.getMchid()));
   packageParams.add(new BasicNameValuePair("nonce_str", nonceStr));
   packageParams.add(new BasicNameValuePair("notify_url", noticeUrl));
   packageParams.add(new BasicNameValuePair("out_trade_no", goodOrderNo));
   packageParams.add(new BasicNameValuePair("product_id", productId));
   packageParams.add(new BasicNameValuePair("spbill_create_ip", ip));
   packageParams.add(new BasicNameValuePair("total_fee", totalFee));
   packageParams.add(new BasicNameValuePair("trade_type", "NATIVE"));
   String sign = genPackageSign(packageParams);
   packageParams.add(new BasicNameValuePair("sign", sign));
   String xmlstring = toXml(packageParams);
   return xmlstring;
  } catch (Exception e) {
   logger.info("genProductArgs fail, ex = " + e.getMessage());
   return null;
  }
 }

 /**
  * 生成支付签名
  *
  * @param params
  * @return
  */
 public static String genAppSign(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(Configure.getKey());
  String appSign = MD5.MD5Encode(sb.toString()).toUpperCase();
  logger.info("orion", appSign);
  return appSign;
 }

 /**
  * 生成调用微信支付所需参数
  *
  * @param prepayId
  * @return
  */
 public static Map<String, String> genPayReq(String prepayId) {
  Map<String, String> resultMap = new HashMap<String, String>();
  String timeStamp = getTimeStamp();
  String nonceStr = getNonceStr();
  List<NameValuePair> signParams = new LinkedList<NameValuePair>();
  signParams.add(new BasicNameValuePair("appid", Configure.getAppid()));
  signParams.add(new BasicNameValuePair("noncestr", nonceStr));
  signParams.add(new BasicNameValuePair("package", "Sign=WXPay"));
  signParams.add(new BasicNameValuePair("partnerid", Configure.getMchid()));
  signParams.add(new BasicNameValuePair("prepayid", prepayId));
  signParams.add(new BasicNameValuePair("timestamp", timeStamp));
  String sign = genAppSign(signParams);
  resultMap.put("appid", Configure.getAppid());
  resultMap.put("noncestr", nonceStr);
  resultMap.put("packageValue", "Sign=WXPay");
  resultMap.put("partnerid", Configure.getMchid());
  resultMap.put("prepayid", prepayId);
  resultMap.put("timestamp", timeStamp);
  resultMap.put("sign", sign);
  return resultMap;
 }

 /**
  * 微信支付生成预支付订单
  *
  * @throws IOException
  * @throws JDOMException
  */
 public static Map<String, String> getPayPreId(String goodOrderNo, String body, String noticeUrl, String ip, String totalFee, String productId) throws Exception {
  String paramsXml = genProductArgs(goodOrderNo, body, noticeUrl, ip, totalFee, productId);
  logger.info("orion", paramsXml);
  byte[] buf = WechatUtil.httpPost(Configure.UNIFIEDORDER_API, paramsXml);
  String contentXml = new String(buf);
  Map<String, String> resultMap = XMLUtil.doXMLParse(contentXml);
  return resultMap;
 }

 public static String getNonceStr() {
  Random random = new Random();
  return MD5.MD5Encode(String.valueOf(random.nextInt(10000)));
 }

 public static String getTimeStamp() {
  return String.valueOf(System.currentTimeMillis() / 1000);
 }

 /**
  * 生成支付二维码
  * @param request
  * @param response
  * @param width
  * @param height
  * @param text 微信生成预定id时,返回的codeUrl
  */
 public static void getQRcode(HttpServletRequest request, HttpServletResponse response, Integer width, Integer height, String text) {
  if (width == null) {
   width = 300;
  }
  if (height == null) {
   height = 300;
  }
  String format = "jpg";
  Hashtable hints = new Hashtable();
  hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
  BitMatrix bitMatrix;
  try {
   bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, hints);
   MatrixToImageWriter.writeToStream(bitMatrix, format, response.getOutputStream());
  } catch (WriterException e) {
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
}

生成二维码需要两jar

<!-- google zxing 二维码jar begin -->
  <dependency>
   <groupId>com.google.zxing</groupId>
   <artifactId>core</artifactId>
   <version>3.3.0</version>
  </dependency>
  <dependency>
   <groupId>com.google.zxing</groupId>
   <artifactId>javase</artifactId>
   <version>3.3.0</version>
  </dependency>
<!-- google zxing 二维码jar begin -->

4、下面是用到的配置类

package com.caifu.tencent.common;

/**
 * User: rizenguo
 * Date: 2014/10/29
 * Time: 14:40
 * 这里放置各种配置数据
 */
public class Configure {
//这个就是自己要保管好的私有Key了(切记只能放在自己的后台代码里,不能放在任何可能被看到源代码的客户端程序中)
 // 每次自己Post数据给API的时候都要用这个key来对所有字段进行签名,生成的签名会放在Sign这个字段,API收到Post数据的时候也会用同样的签名算法对Post过来的数据进行签名和验证
 // 收到API的返回的时候也要用这个key来对返回的数据算下签名,跟API的Sign数据进行比较,如果值不一致,有可能数据被第三方给篡改

 private static String key = "A6gB0Dy4dsfdssuPCPsdfdshkSCDQcr3eXS";

 private static String appSecret="7584sdfdsfe4f26fadsfsdfs56f10728a";

 //微信分配的公众号ID(开通公众号之后可以获取到)
 private static String appID = "wxaf0b86sdfsdf8afbf";

 //微信支付分配的商户号ID(开通公众号的微信支付功能之后可以获取到)
 private static String mchID = "14012313702";

 //受理模式下给子商户分配的子商户号
 private static String subMchID = "";

 //HTTPS证书的本地路径
 private static String certLocalPath = "";

 //HTTPS证书密码,默认密码等于商户号MCHID
 private static String certPassword = "";

 //是否使用异步线程的方式来上报API测速,默认为异步模式
 private static boolean useThreadToDoReport = true;

 //机器IP
 private static String ip = "";

 //以下是几个API的路径:
 //1)被扫支付API
 public static String UNIFIEDORDER_API = "https://api.mch.weixin.qq.com/pay/unifiedorder";

 public static String PAY_API = "https://api.mch.weixin.qq.com/pay/micropay";

 //2)被扫支付查询API
 public static String PAY_QUERY_API = "https://api.mch.weixin.qq.d/pay/orderquery";

 //3)退款API
 public static String REFUND_API = "https://api.mch.weixin.qq.com/secapi/pay/refund";

 //4)退款查询API
 public static String REFUND_QUERY_API = "https://api.mch.weixin.qq.com/pay/refundquery";

 //5)撤销API
 public static String REVERSE_API = "https://api.mch.weixin.qq.com/secapi/pay/reverse";

 //6)下载对账单API
 public static String DOWNLOAD_BILL_API = "https://api.mch.weixin.qq.com/pay/downloadbill";

 //7) 统计上报API
 public static String REPORT_API = "https://api.mch.weixin.qq.com/payitil/report";

 public static boolean isUseThreadToDoReport() {
  return useThreadToDoReport;
 }

 public static void setUseThreadToDoReport(boolean useThreadToDoReport) {
  Configure.useThreadToDoReport = useThreadToDoReport;
 }

 public static String HttpsRequestClassName = "com.tencent.common.HttpsRequest";

 public static void setKey(String key) {
  Configure.key = key;
 }

 public static void setAppID(String appID) {
  Configure.appID = appID;
 }

 public static void setMchID(String mchID) {
  Configure.mchID = mchID;
 }

 public static void setSubMchID(String subMchID) {
  Configure.subMchID = subMchID;
 }

 public static void setCertLocalPath(String certLocalPath) {
  Configure.certLocalPath = certLocalPath;
 }

 public static void setCertPassword(String certPassword) {
  Configure.certPassword = certPassword;
 }

 public static void setIp(String ip) {
  Configure.ip = ip;
 }

 public static String getKey(){
  return key;
 }

 public static String getAppid(){
  return appID;
 }

 public static String getMchid(){
  return mchID;
 }

 public static String getSubMchid(){
  return subMchID;
 }

 public static String getCertLocalPath(){
  return certLocalPath;
 }

 public static String getCertPassword(){
  return certPassword;
 }

 public static String getIP(){
  return ip;
 }

 public static void setHttpsRequestClassName(String name){
  HttpsRequestClassName = name;
 }

}

在这里需要注意的配置
private static String key = “A6gB0Dy4dsfdssuPCPsdfdshkSCDQcr3eXS”;
这里的key 是登陆https://pay.weixin.qq.com/index.php/core/info (微信商户平台)设置的api_key

5、xml 解析工具类

package com.caifu.login.utils;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.dom4j.io.SAXReader;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;

/**
 * xml工具类
 *
 * @author miklchen
 *
 */
public class XMLUtil {

 /**
  * 解析xml,返回第一级元素键值对。如果第一级元素有子节点,则此节点的值是子节点的xml数据。
  *
  * @param strxml
  * @return
  * @throws JDOMException
  * @throws IOException
  */
 public static Map doXMLParse(String strxml) throws JDOMException, IOException {
  strxml = strxml.replaceFirst("encoding=\".*\"", "encoding=\"UTF-8\"");

  if (null == strxml || "".equals(strxml)) {
   return null;
  }

  Map m = new HashMap();

  InputStream in = new ByteArrayInputStream(strxml.getBytes("UTF-8"));
  SAXBuilder builder = new SAXBuilder();
  Document doc = builder.build(in);
  Element root = doc.getRootElement();
  List list = root.getChildren();
  Iterator it = list.iterator();
  while (it.hasNext()) {
   Element e = (Element) it.next();
   String k = e.getName();
   String v = "";
   List children = e.getChildren();
   if (children.isEmpty()) {
    v = e.getTextNormalize();
   } else {
    v = XMLUtil.getChildrenText(children);
   }

   m.put(k, v);
  }

  // 关闭流
  in.close();

  return m;
 }

 /**
  * 获取子结点的xml
  *
  * @param children
  * @return String
  */
 public static String getChildrenText(List children) {
  StringBuffer sb = new StringBuffer();
  if (!children.isEmpty()) {
   Iterator it = children.iterator();
   while (it.hasNext()) {
    Element e = (Element) it.next();
    String name = e.getName();
    String value = e.getTextNormalize();
    List list = e.getChildren();
    sb.append("<" + name + ">");
    if (!list.isEmpty()) {
     sb.append(XMLUtil.getChildrenText(list));
    }
    sb.append(value);
    sb.append("</" + name + ">");
   }
  }

  return sb.toString();
 }

 /**
  * 将requestxml通知结果转出啊成map
  * @param request
  * @return
  * @throws Exception
  */
 public static Map<String, String> parseXml(HttpServletRequest request) throws Exception {
  // 解析结果存储在HashMap
  Map<String, String> map = new HashMap<String, String>();
  InputStream inputStream = request.getInputStream();
  // 读取输入流
  SAXReader reader = new SAXReader();
  org.dom4j.Document document = reader.read(inputStream);
  // 得到xml根元素
  org.dom4j.Element root = document.getRootElement();
  // 得到根元素的所有子节点
  List<org.dom4j.Element> elementList = root.elements();
  // 遍历所有子节点
  for (org.dom4j.Element e : elementList)
   map.put(e.getName(), e.getText());
  // 释放资源
  inputStream.close();
  inputStream = null;
  return map;
 }

}

6、整个后台服务已经完成,最后关闭页面微信支付二维码,告知用户支付已经完成了

var f;
 /* 定时任务方法,异步请求去查询订单是否支付*/
 function GetOrder() {
  var orderId = $('#orderId').val();
  if (orderId != '') {
   $.ajax({
    url : "${base}/balance/auth/isPay?orderId=" + orderId,
    type : "GET",
    async : false,
    success : function(d) {
     if (d == "1") {
      //当获取到微信支付结果时,关闭二维码div
      $(".weixinpay").css("display", "none");
      $("#zhichutankuang").css("display", "block");
      ////当获取到微信支付结果时,关闭定时任务
      clearInterval(f);
      // layer.alert('付款成功', {
      // skin : 'layui-layer-molv', // 样式类名
      // closeBtn : 0
      // }, function() {
      // location.href = "${base}/balance/auth/presentation?tjNo=" + $("#tjNo").val();
      // });

     }
    }
   });
  }
 }
 //异步请求获取生成二维码的url
 $(".paylast").click(function() {
  var $payType = $('input:radio:checked').val();
  var $money = $("#money").val();
  var $tjReportType = $("#tjReportType").val();
  var $tjNo = $("#tjNo").val();
  $.ajax({
   url : "${base}/balance/auth/wechatInfo",
   type : "POST",
   async : false,
   data : {
    payType : $payType,
    money : $money,
    tjNo : $tjNo,
    tjReportType : $tjReportType
   },
   success : function(d) {
    if (d.resultCode == "1000") {
     //当请求成功时,设置二维码图片地址
     $("#codeImg").attr('src', d.obj);
     $("#orderId").val(d.attributes.orderId);
     ////当请求成功时,启动定时任务,每隔3秒去后台查询一次订单是否成功
     f = setInterval(GetOrder, 3000);
     // GetOrder(true);
    }
   }
  });
  $(".selpaycon").css("display", "none");
  $(".weixinpay").css("display", "block");
 });

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

(0)

相关推荐

  • java Struts2 在拦截器里的跳转问题

    复制代码 代码如下: java.lang.IllegalStateException at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:405) at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:725) at org.apache.struts2.dispatcher.Dispatcher.servi

  • java实现301跳转和重定向的方法

    java301跳转和重定向 复制代码 代码如下: response.setStatus(301); response.setHeader("Location","http://www.baidu.com"); //---分割线--- response.sendRedirect("http://baidu.com"); 以上就是本文的全部内容了,希望大家能够喜欢.

  • java实现在SSM下使用支付宝扫码支付功能

    本文实例为大家分享了java使用支付宝扫码支付的具体代码,供大家参考,具体内容如下 准备工作 首先开通支付宝沙箱的测试账号,里面会有消费者账户和收款方账户 手机扫码下载手机端app 基础配置 所需jar包 AlipayConfig package com.alipay.config; import java.io.FileWriter; import java.io.IOException; import java.util.ResourceBundle; /* * *类名:AlipayConf

  • Java Web实现session过期后自动跳转到登陆页功能【基于过滤器】

    本文实例讲述了Java Web实现session过期后自动跳转到登陆页功能.分享给大家供大家参考,具体如下: 通过过滤器的方式实现 session过期后自动跳转到登陆页 过滤器只在与servlet规范2.3版兼容的服务器上有作用.如果你的Web应用需要支持旧版服务器,就不能使用过滤器. 一.建立基本过滤器 建立一个过滤器涉及下列五个步骤: 1)建立一个实现Filter接口的类SessionFilter .这个类需要三个方法,分别是:doFilter.init和destroy.doFilter方法

  • Java微信支付之公众号支付、扫码支付实例

    微信支付现在已经变得越来越流行了,随之也出现了很多以可以快速接入微信支付为噱头的产品,不过方便之余也使得我们做东西慢慢依赖第三方,丧失了独立思考的能力,这次打算分享下我之前开发过的微信支付. 一 .H5公众号支付 要点:正确获取openId以及统一下单接口,正确处理支付结果通知,正确配置支付授权目录 H5的支付方式是使用较为广泛的方式,这种支付方式主要用于微信内自定义菜单的网页,依赖手机上安装的微信客户端,高版本的微信才支持微信支付,下面按我的流程注意说明 1  编写用于支付的页面,由于是测试用

  • java servlet 几种页面跳转的方法

    Servlet: 当然,在servlet中,一般跳转都发生在doGet, doPost等方法里面. 1) redirect 方式 response.sendRedirect("/a.jsp"); 页面的路径是相对路径.sendRedirect可以将页面跳转到任何页面,不一定局限于本web应用中,如: response.sendRedirect("http://www.jb51.net"); 跳转后浏览器地址栏变化. 这种方式要传值出去的话,只能在url中带param

  • java实现二维码扫码授权登陆

    假设现在有2个设备,A设备需要扫码授权登陆,B设备是已经登陆了的设备.然后实现如下: 一.A设备生成生成二维码: A设备向服务器请求getLoginCode接口,这个接口根据请求的sessionId进行base64或其他加密方式进行加密,然后以此作为二维码的值,并将这个loginCode写到redis里,设置5分钟过期.然后将这个loginCode返回给A设备,A设备以此值来生成登陆的二维码. 二.B设备扫码授权 B设备来扫A设备的二维码的时候,携带二维码的值,请求授权登陆的接口scanConf

  • 扫二维码自动跳转【java】详解

    这个帖子网上很多了,但是都是讲理论知识,我呢,喜欢搞代码.既然搞完了,就贴出来备忘一下,也可以分享一下. 重复理论步骤: 1.进入网站-生成UUID 2.跳转到二维码页面(二维码包含UUID) 3.二维码页面写一个js,自动请求服务器查询二维码是否被扫 4.服务器收到请求,查询,如果还没被扫,进入等待,先不返回结果 5.一旦被扫,立即返回结果,页面js收到响应,做后续处理 OK,步骤是这样的没错,不过有一点缺点,步骤3中如果请求超时怎么办. 这个微信web登录有示例,服务器被请求后,持续等待25

  • 详解JAVA后端实现统一扫码支付:微信篇

    最近做完了一个项目,正好没事做,产品经理就给我安排了一个任务. 做一个像收钱吧这样可以统一扫码收钱的功能. 一开始并不知道是怎么实现的,咨询了好几个朋友,才知道大概的业务流程:先是开一个网页用来判断支付平台,是微信还是支付宝,判断过后就好办了,直接照搬微信支付和支付宝的官方文档.不过微信的文档感觉有点坑,得多花点心思. 现在讲讲怎么实现微信支付网页支付,也就是公众号支付: 1.判断支付平台,在判断是微信平台时,必须使用window.location打开网页,使用其他方法在IOS版微信无法打开网页

  • java实现网站微信扫码支付

    一.网站微信扫码支付开发并没有现成的java示例,总结一下自己微信扫码支付心得 二.首先去微信公众平台申请账户 https://mp.weixin.qq.com ** 三.账户开通.开发者认证之后就可以进行微信支付开发了 1.微信统一下单接口调用获取预支付id,以及生成二维码所需的codeUrl /** * 保存订单,并生成二维码所需的codeUrl * * @param request * @param response * @param notifyURLBuf * @param order

  • 教你用Java在个人电脑上实现微信扫码支付

    Java实现PC微信扫码支付 做一个电商网站支付功能必不可少,那我们今天就来盘一盘微信支付. 微信支付官方网站 业务流程: 开发指引文档 支付服务开发前提准备: 1.SDK下载:SDK 2.利用外网穿透,获得一个外网域名:natapp 3.APPID,商户ID,密钥 注:上面三个参数需要自己申请 开发阶段: 导入依赖: <!--eureka的客户端依赖--> <dependency> <groupId>org.springframework.cloud</grou

  • Java SpringMVC实现PC端网页微信扫码支付(完整版)

    一:前期微信支付扫盲知识 前提条件是已经有申请了微信支付功能的公众号,然后我们需要得到公众号APPID和微信商户号,这个分别在微信公众号和微信支付商家平台上面可以发现.其实在你申请成功支付功能之后,微信会通过邮件把Mail转给你的,有了这些信息之后,我们就可以去微信支付服务支持页面:https://pay.weixin.qq.com/service_provider/index.shtml 打开这个页面,点击右上方的链接[开发文档]会进入到API文档说明页面,看起来如下 选择红色圆圈的扫码支付就

  • JAVA微信扫码支付模式二线上支付功能实现以及回调

     一.准备工作 首先吐槽一下微信关于支付这块,本身支持的支付模式就好几种,但是官方文档特别零散,连像样的Java相关的demo也没几个.本人之前没有搞过微信支付,一开始真是被它搞晕,折腾两天终于调通了,特此写下来,以享后人吧! 关于准备工作,就"微信扫码支付模式二"官方文档地址在这 https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1 可以先看看,实际上需要准备的东西有以下几个: 其中APP_ID和APP_SECRE

  • java实现微信扫码支付功能

    本文实例为大家分享了java实现微信扫码支付的具体代码,供大家参考,具体内容如下 1.maven项目的pom.xml中添加如下jar包: <dependency> <groupId>com.github.wxpay</groupId> <artifactId>wxpay-sdk</artifactId> <version>0.0.3</version> </dependency> 2.编写WeWxConfig类

  • PHP 微信扫码支付源代码(推荐)

    代码中包含四个文件createUrl.php.ArrayToXML.php.returnGoodsUrl.php.notifyUrl.php . 具体详细代码大家可以参考下: createUrl.php:创建微信二维码支付链接 ``` /** * @author chantrans * 本页面的作用是生成商品二维码链接 */ echo createUrl("12314124"); /** * 产生随机字符串 */ function getNonceStr() $chars = 'ABC

  • PHP 接入微信扫码支付总结(总结篇)

    微信扫码支付分为两种模式, 模式一比较复杂,需要公众号配置回调地址. 模式二比较简单,只需要在代码中配置回调地址就可以了. 我这次使用的是模式二. 需要配置参数, const APPID = 'xxx'; const MCHID = 'xxx'; const KEY = 'xxx'; const APPSECRET = 'xxx'; 配置公众号的appid,appsecret.以及微信支付的mchid与key. 生成二维码,这个页面需要自己去美化,不像支付宝那样自带效果. require_onc

  • SpringBoot微信扫码支付的实现示例

    一.首先导入生成二维码和微信支付环境 <!-- 生成二维码工具 --> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.2.1</version> </dependency> <dependency> <groupId>com.google.zx

  • .NET微信扫码支付接入(模式二-NATIVE)

    一.前言 经过两三天的琢磨总算完成了微信扫码支付功能,不得不感叹几句: 微信提供的DEMO不错,直接复制粘贴就可以跑起来了: 微信的配置平台我真是服了.公众平台.商户平台.开放平台,一个平台一套账户密码,大写的恶心        DEMO地址:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1 .NET版DEMO中的Lib文件夹是关键,直接复制到自己的代码里,或者打成dll随个人意愿. 二.正文 Step1:肯定是产生商户

  • 分享微信扫码支付开发遇到问题及解决方案-附Ecshop微信支付插件

    最近比较工作比较轻松,帮一个朋友的基于ecshop开发的商城加入微信扫描支付功能,本以为是很简单的事儿--下载官方sdk或开发帮助文档,按着里面的做就ok了,谁知折腾了两三天的时间才算搞定,中间也带着疑问在网上找了不少技术文章,却发现都只是比较粗略的写他们是怎么开发接入的,并没有解决我遇到的问题...,唉,有时候真心的感觉'只能靠自己'. 本文就是想把自己遇到的问题及解决办法写出来,让做这方面开发的朋友有所帮助! 开发之前,先查看官方[扫码支付]开发文档,扫码支付分为以下两种模式: △模式一:

随机推荐