java微信_java微信开发 - CSDN
精华内容
参与话题
  • 微信支付微信扫码支付java

    千人学习 2018-10-22 21:38:08
    现在所有的web端网页商城常用的支付方式之一。web网站开发课程,web网站要实现支付的话,必须学习微信扫码支付。内容逻辑清晰,包你一会就会
  • JAVA实现微信支付功能

    万次阅读 热门讨论 2019-02-28 09:12:30
    这两天,需要接入微信支付功能。由于我是公众号开发,因此,我选择的微信支付方式是JSAPI支付方式。 二,解决方案 2.1 配置微信平台 ①配置微信公众平台 登录微信公众平台=》公众号设置=》功能设置=》网页授权域名 ...

    一,问题

    这两天,需要接入微信支付功能。由于我是公众号开发,因此,我选择的微信支付方式是JSAPI支付方式。

    二,解决方案

    2.1 配置微信平台

    ①配置微信公众平台

    登录微信公众平台=》公众号设置=》功能设置=》网页授权域名
    

    在这里插入图片描述

    在这里插入图片描述

    ②配置微信商家平台

    产品中心=》开发配置
    

    在这里插入图片描述

    在这里插入图片描述

    2.2 后台代码的实现

    JSAPI官方文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
    

    ①先去官方下载SDK,并导进项目中

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

    在这里插入图片描述

    ②准备好11个参数

    appid:商家平台ID。在微信的平台上有
    body:商品描述。
    mch_id:商户ID。在微信的平台上有
    nonce_str:随机字符串,UUID就好了。
    openid:用户标识。因为这边是用户已经登录成功了。所以在session中就能拿到。
    out_trade_no:商户订单号
    spbill_create_ip:终端IP。这个可以从请求头中拿到
    total_fee:支付金额。单位是分。
    trade_type:交易类型。这里我填JSAPI
    notify_url:通知地址。就是用户支付成功之后,微信访问你的哪个接口,跟你传递支付成功的相关信息。
    
    sign:签名。这个签名它是由上面的10个参数计算得出的。
    

    ③源码
    sendPay类:

    import java.io.IOException;
    import java.io.InputStream;
    import java.math.BigDecimal;
    import java.net.URLEncoder;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.UUID;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.http.auth.AUTH;
    import org.hamcrest.core.Is;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import com.jc.util.wxPay.WXPayUtil;
    import com.sun.xml.internal.fastinfoset.Encoder;
    
    import controller.AuthUtil;
    import net.sf.json.JSONObject;
    
    @Controller
    @RequestMapping("/pay")
    public class sendPay {
     
    	/**
    	 * @Description 微信浏览器内微信支付/公众号支付(JSAPI)
    	 * @param request
    	 * @param code
    	 * @return Map
    	 */
    	@RequestMapping(value = "orders")
    	public @ResponseBody Map<String, String> orders(HttpServletRequest request, HttpServletResponse response) {
    		try {
    			 
    			String openId = "用户的openid";
    
    			// 拼接统一下单地址参数
    			Map<String, String> paraMap = new HashMap<String, String>();
    			// 获取请求ip地址
    			String ip = request.getHeader("x-forwarded-for");
    			if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
    				ip = request.getHeader("Proxy-Client-IP");
    			}
    			if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
    				ip = request.getHeader("WL-Proxy-Client-IP");
    			}
    			if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
    				ip = request.getRemoteAddr();
    			}
    			if (ip.indexOf(",") != -1) {
    				String[] ips = ip.split(",");
    				ip = ips[0].trim();
    			}
    
    			paraMap.put("appid", AuthUtil.APPID); // 商家平台ID
    			paraMap.put("body", "纯情小店铺-薯条"); // 商家名称-销售商品类目、String(128)
    			paraMap.put("mch_id", AuthUtil.MCHID); // 商户ID
    			paraMap.put("nonce_str", WXPayUtil.generateNonceStr()); // UUID
    			paraMap.put("openid", openId);
    			paraMap.put("out_trade_no", UUID.randomUUID().toString().replaceAll("-", ""));// 订单号,每次都不同
    			paraMap.put("spbill_create_ip", ip);
    			paraMap.put("total_fee", "1"); // 支付金额,单位分
    			paraMap.put("trade_type", "JSAPI"); // 支付类型
    			paraMap.put("notify_url", "用户支付完成后,你想微信调你的哪个接口");// 此路径是微信服务器调用支付结果通知路径随意写
    			String sign = WXPayUtil.generateSignature(paraMap, AuthUtil.PATERNERKEY);
    			paraMap.put("sign", sign);
    			String xml = WXPayUtil.mapToXml(paraMap);// 将所有参数(map)转xml格式
    
    			// 统一下单 https://api.mch.weixin.qq.com/pay/unifiedorder
    			String unifiedorder_url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
    
    			System.out.println("xml为:" + xml);
    
    			// String xmlStr = HttpRequest.sendPost(unifiedorder_url,
    			// xml);//发送post请求"统一下单接口"返回预支付id:prepay_id
    
    			String xmlStr = HttpRequest.httpsRequest(unifiedorder_url, "POST", xml);
    
    			System.out.println("xmlStr为:" + xmlStr);
    
    			// 以下内容是返回前端页面的json数据
    			String prepay_id = "";// 预支付id
    			if (xmlStr.indexOf("SUCCESS") != -1) {
    				Map<String, String> map = WXPayUtil.xmlToMap(xmlStr);
    				prepay_id = (String) map.get("prepay_id");
    			}
    
    			Map<String, String> payMap = new HashMap<String, String>();
    			payMap.put("appId", AuthUtil.APPID);
    			payMap.put("timeStamp", WXPayUtil.getCurrentTimestamp() + "");
    			payMap.put("nonceStr", WXPayUtil.generateNonceStr());
    			payMap.put("signType", "MD5");
    			payMap.put("package", "prepay_id=" + prepay_id);
    			String paySign = WXPayUtil.generateSignature(payMap, AuthUtil.PATERNERKEY);
    			payMap.put("paySign", paySign);
    			//将这个6个参数传给前端
    			return payMap;
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    
    	/**
    	 * @Title: callBack
    	 * @Description: 支付完成的回调函数
    	 * @param:
    	 * @return:
    	 */
    	@RequestMapping("/notify")
    	public String callBack(HttpServletRequest request, HttpServletResponse response) {
    		// System.out.println("微信支付成功,微信发送的callback信息,请注意修改订单信息");
    		InputStream is = null;
    		try {
    
    			is = request.getInputStream();// 获取请求的流信息(这里是微信发的xml格式所有只能使用流来读)
    			String xml = WXPayUtil.InputStream2String(is);
    			Map<String, String> notifyMap = WXPayUtil.xmlToMap(xml);// 将微信发的xml转map
    			
    			System.out.println("微信返回给回调函数的信息为:"+xml);
    			
    			if (notifyMap.get("result_code").equals("SUCCESS")) {
    				String ordersSn = notifyMap.get("out_trade_no");// 商户订单号
    				String amountpaid = notifyMap.get("total_fee");// 实际支付的订单金额:单位 分
    				BigDecimal amountPay = (new BigDecimal(amountpaid).divide(new BigDecimal("100"))).setScale(2);// 将分转换成元-实际支付金额:元
    
    				/*
    				 * 以下是自己的业务处理------仅做参考 更新order对应字段/已支付金额/状态码
    				 */
    				System.out.println("===notify===回调方法已经被调!!!");
    				
    			}
    			
    			// 告诉微信服务器收到信息了,不要在调用回调action了========这里很重要回复微信服务器信息用流发送一个xml即可
    			response.getWriter().write("<xml><return_code><![CDATA[SUCCESS]]></return_code></xml>");
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			if (is != null) {
    				try {
    					is.close();
    				} catch (IOException e) { 
    					e.printStackTrace();
    				}
    			}
    		}
    		
    		return null;
    	}
    
    }
    
    

    HttpRequest类:

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    import java.net.URL;
    import java.net.URLConnection;
    import java.util.List;
    import java.util.Map;
    
    import javax.net.ssl.HttpsURLConnection;
    
    public class HttpRequest {
    	/**
    	 * 向指定URL发送GET方法的请求
    	 * 
    	 * @param url
    	 *            发送请求的URL
    	 * @param param
    	 *            请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
    	 * @return URL 所代表远程资源的响应结果
    	 */
    	public static String sendGet(String url, String param) {
    		String result = "";
    		BufferedReader in = null;
    		try {
    			String urlNameString = url + "?" + param;
    			System.out.println(urlNameString);
    			URL realUrl = new URL(urlNameString);
    			// 打开和URL之间的连接
    			URLConnection connection = realUrl.openConnection();
    			// 设置通用的请求属性
    			connection.setRequestProperty("accept", "*/*");
    			connection.setRequestProperty("connection", "Keep-Alive");
    			connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
    			// 建立实际的连接
    			connection.connect();
    			// 获取所有响应头字段
    			Map<String, List<String>> map = connection.getHeaderFields();
    			// 遍历所有的响应头字段
    			for (String key : map.keySet()) {
    				System.out.println(key + "--->" + map.get(key));
    			}
    			// 定义 BufferedReader输入流来读取URL的响应
    			in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    			String line;
    			while ((line = in.readLine()) != null) {
    				result += line;
    			}
    		} catch (Exception e) {
    			System.out.println("发送GET请求出现异常!" + e);
    			e.printStackTrace();
    		}
    		// 使用finally块来关闭输入流
    		finally {
    			try {
    				if (in != null) {
    					in.close();
    				}
    			} catch (Exception e2) {
    				e2.printStackTrace();
    			}
    		}
    		return result;
    	}
    
    	/**
    	 * 向指定 URL 发送POST方法的请求
    	 * 
    	 * @param url
    	 *            发送请求的 URL
    	 * @param param
    	 *            请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
    	 * @return 所代表远程资源的响应结果
    	 */
    	public static String sendPost(String url, String param) {
    		PrintWriter out = null;
    		BufferedReader in = null;
    		String result = "";
    		try {
    			URL realUrl = new URL(url);
    			// 打开和URL之间的连接
    			URLConnection conn = realUrl.openConnection();
    			// 设置通用的请求属性
    			conn.setRequestProperty("accept", "*/*");
    			conn.setRequestProperty("connection", "Keep-Alive");
    			conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
    			// 发送POST请求必须设置如下两行
    			conn.setDoOutput(true);
    			conn.setDoInput(true);
    			// 获取URLConnection对象对应的输出流
    			out = new PrintWriter(conn.getOutputStream());
    			// 发送请求参数
    			out.print(param);
    			// flush输出流的缓冲
    			out.flush();
    			// 定义BufferedReader输入流来读取URL的响应
    			in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
    			String line;
    			while ((line = in.readLine()) != null) {
    				result += line;
    			}
    		} catch (Exception e) {
    			System.out.println("发送 POST 请求出现异常!" + e);
    			e.printStackTrace();
    		}
    		// 使用finally块来关闭输出流、输入流
    		finally {
    			try {
    				if (out != null) {
    					out.close();
    				}
    				if (in != null) {
    					in.close();
    				}
    			} catch (IOException ex) {
    				ex.printStackTrace();
    			}
    		}
    		return result;
    	}
    
    	/**
    	 * post请求并得到返回结果
    	 * 
    	 * @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();
    			}
    			// 从输入流读取返回内容
    			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 "";
    	}
    }
    

    AuthUtil类

    import java.io.IOException;
    
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.util.EntityUtils;
    
    import net.sf.json.JSONObject;
    public class AuthUtil {
    	public static final String APPID = "平台ID";
    	public static final String APPSECRET = "平台密钥";
    	public static final String MCHID = "商家ID";
    	public static final String PATERNERKEY = "商家密钥";
    	
    	
    	public static JSONObject doGetJson(String url) throws ClientProtocolException, IOException {
    		JSONObject jsonObject = null;
    		// 首先初始化HttpClient对象
    		DefaultHttpClient client = new DefaultHttpClient();
    		// 通过get方式进行提交
    		HttpGet httpGet = new HttpGet(url);
    		// 通过HTTPclient的execute方法进行发送请求
    		HttpResponse response = client.execute(httpGet);
    		// 从response里面拿自己想要的结果
    		HttpEntity entity = response.getEntity();
    		if (entity != null) {
    			String result = EntityUtils.toString(entity, "UTF-8");
    			jsonObject = jsonObject.fromObject(result);
    		}
    		// 把链接释放掉
    		httpGet.releaseConnection();
    		return jsonObject;
    	}
    }
    

    2.3 前端的实现

    这是只用一个jsp页面来做测试

    <%@ page language="java" contentType="text/html; charset=UTF-8"
    	pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <script type="text/javascript" src="./js/jquery-1.11.0.min.js"></script>
    <title>微信支付JSP</title>
    </head>
    <body> 
    	<input type="button" value="进行微信支付" id="payId">
    
    	<script type="text/javascript">
    	
    		$(function(){
    			var appId,timeStamp,nonceStr,package,signType,paySign; 
    			
    			$("#payId").click(function(){
    				pay();
    			});
    			
    			//去后台拿六个参数
    			function pay(){   
    				var url = "http://localhost:8082/WeChat/pay/orders";
    			  	$.get(url,function(result) {	
    		  				appId = result.appId;
    						timeStamp = result.timeStamp;
    						nonceStr = result.nonceStr;
    						package = result.package;
    						signType = result.signType;
    						paySign = result.paySign;
    						
    						if (typeof WeixinJSBridge == "undefined") {
    							if (document.addEventListener) {
    								document.addEventListener('WeixinJSBridgeReady',
    										onBridgeReady, false);
    							} else if (document.attachEvent) {
    								document.attachEvent('WeixinJSBridgeReady',
    										onBridgeReady);
    								document.attachEvent('onWeixinJSBridgeReady',
    										onBridgeReady);
    							}
    							alert("请在微信上进行支付操作!");
    							onBridgeReady();
    						} else { 
    							onBridgeReady();
    						}
    					});
    				}
    			//去微信那边发起支付请求
    			function onBridgeReady(){
    				
    				 alert("appId:"+appId+" "+"timeStamp:"+timeStamp+" "+"nonceStr:"+nonceStr+" "+"package:"+package+" "+"signType:"+signType+" "+"paySign:"+paySign+" ");
    				
    				  WeixinJSBridge.invoke( 'getBrandWCPayRequest', {
    					  "appId":appId,     //公众号名称,由商户传入     
    			          "timeStamp":timeStamp,         //时间戳,自1970年以来的秒数     
    			          "nonceStr":nonceStr, //随机串     
    			          "package":package,     
    			          "signType":signType,         //微信签名方式:     
    			          "paySign":paySign //微信签名 
    			         }, 
    			         function(res){      
    			      	   if(res.err_msg == "get_brand_wcpay_request:ok" ) {
    			                 //alert('支付成功');
    			                 console.log("支付成功");
    			                 //支付成功后跳转的页面
    			             }else if(res.err_msg == "get_brand_wcpay_request:cancel"){
    			            	 alert('支付取消');
    			             }else if(res.err_msg == "get_brand_wcpay_request:fail"){
    			            	 alert('支付失败');
    			            	 
    			            	 alert(JSON.stringify(res));
    			            	 
    			                 WeixinJSBridge.call('closeWindow');
    			             } //使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
    			   });    
    			}
    		})
    </script>
    
    </body>
    </html>
    

    三,总结

    虽然第一次看官方文档很乱,信息量很多,但仔细总结一下,其实就下面这点流程而已。
    

    在这里插入图片描述

    最后,很感谢网上一位大哥分享了他的经验。
    大哥链接:https://blog.csdn.net/javaYouCome/article/details/79473743

    展开全文
  • (一)java微信授权登录

    万次阅读 2018-05-07 09:34:55
    最近工作中,接触到微信开发(公众号服务号开发)。由于第一次接触微信开发,所以第一步先去看微信开发文档。微信公众平台开发文档接下来,我们要使用微信来进行授权登录。微信授权的话,获取用户信息有两种:1.静默...

    最近工作中,接触到微信开发(公众号服务号开发)。

    由于第一次接触微信开发,所以第一步先去看微信开发文档。

    微信公众平台开发文档

    接下来,我们要使用微信来进行授权登录。

    微信授权的话,获取用户信息有两种:

    1.静默获取用户信息、

    2.弹出授权界面,用户确认之后获取用户信息(这种方法能够获取到更多信息)。

    开发准备,登录微信公众平台后台->基本配置->公众号开发信息:

    1.获取到AppID

    2.AppSecret

    3.设置IP白名单


    4.添加网页授权域名

    公众号设置->功能设置



    这一步,小伙伴本地开发的话没有域名,可以使用内网穿透软件,这里我用的是NATAPP,这样我们就能得到一个域名了,

    然后按照微信的流程来绑定授权域名就好了。

    获取用户信息,需要openid,然而获取openid的话要通过这个接口先获得一个code

    https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

    这里我们用的是弹出授权页面snsapi_userinfo

    后台授权接口代码

        @RequestMapping("/")
        public void login(HttpServletResponse response) {
                    //这里是回调的url
                    String redirect_uri = URLEncoder.encode("http://回调页面的路径", "UTF-8");
                    String url = "https://open.weixin.qq.com/connect/oauth2/authorize?" +
                            "appid=APPID" +
                            "&redirect_uri=REDIRECT_URI"
                            "&response_type=code" +
                            "&scope=SCOPE" +
                            "&state=123#wechat_redirect";
                    response.sendRedirect(url.replace("APPID","你的APPID").replace("REDIRECT_URL",redirect_url).replace("SCOPE","snsapi_userinfo"));
        }

    使用微信web开发工具访问该接口,会弹出授权确认界面



    用户点击确认登录之后跳转到我们的回调接口,并携带上code参数redirect_uri/?code=CODE&state=STATE,那我们就通过code来获取openid了。

    获取code后,请求以下链接获取access_token与openid:  https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code


    后台回调接口代码

        @RequestMapping("/index")
        public void index(String code) {
                    String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
                //开始请求url地址,第一次请求通过code获取openid与access_token     
                 UrlConnUtils.get(url.replace("APPID", "你的APPID").replace("SECRET", "你的SECRET")
                          .replace("CODE", code), new GetDataUrlConnListener() {                
                         @Override
                         public void onSuccess(HttpURLConnection connection) throws IOException {
                            String data = MyUtils.inputStreamToString(connection.getInputStream());
                            JSONObject jsonObject = JSONObject.parseObject(data);
                            if (jsonObject.getString("openid") != null) {
                                //拉取用户信息
                                String openid = jsonObject.getString("openid");
                                String access_token = jsonObject.getString("access_token");
                                String url = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
                                 //第二次请求,用openid与access_token获取用户的信息
                                UrlConnUtils.get(url.replace("OPENID", openid).replace("ACCESS_TOKEN", access_token), new GetDataUrlConnListener() {
                                    @Override
                                    public void onSuccess(HttpURLConnection connection) throws IOException {
                                        String data = MyUtils.inputStreamToString(connection.getInputStream());                                   
                                        System.out.println(data);//输出微信返回的用户信息
                            }
                        }
                    });
        }


    第一次返回的数据:
    {
        "access_token":"9_zB3*****************w",
        "expires_in":7200,
        "refresh_token":"9_Uze***************9WTQ",
        "openid":"o*************ug",
        "scope":"snsapi_userinfo"
    }
    第二次返回的数据:(用户的信息)
    {
    "openid":"o***********g",
    "nickname":"Smile",
    "sex":1,
    "language":"zh_CN",
    "city":"厦门",
    "province":"福建",
    "country":"中国",
    "headimgurl":"http:\/\/thirdwx.qlogo.cn\/mmopen\/vi_32\/Q0j4TwGTfTLs8SZLLWjyib0Q\/132",
    "privilege":[]
    }

    这样就大功告成了!

    展开全文
  • Java微信授权登陆

    千次阅读 2019-04-11 10:21:28
    微信登陆 前提: 微信公众平台:注册微信认证的公众号也就是服务号 ,拥有跟高级权限的微信接口。(注册服务号需要一些企业信息,需自己或者公司解决) 注: 2018年12月起 订阅号不能认证升级为服务号。但可以...

    微信登陆

     

    前提:

    微信公众平台:注册微信认证的公众号也就是服务号 ,拥有跟高级权限的微信接口。(注册服务号需要一些企业信息,需自己或者公司解决)

    注: 2018年12月起 订阅号不能认证升级为服务号。但可以将你的订阅号迁移至另一个公众号,需300元费用。

    准备公众号的:

    APPID 与  APPSECRET

    二、服务号注册成功后,如果项目也有服务号的公众号平台,跟项目负责人沟通将你个人的微信号添加为服务号的管理

    找到左边导航栏最下面的 基本配置 进去, 记住公众号的 AppId 与 AppSevrect , 如果AppServret忘记了重置重新记住。

     

    配置IP白名单,项目所处的IP配置进去,如拿自己的本机ip用于临时的配置上去,等项目上线重新配置IP。

     

    然后微信登陆需要微信网页授权,在公众中网页授权需要配置一个域名,准备一个备案的域名,域名备案好大概需要20个工作日,如果没有可以下载 花生壳软件 新手注册 会送一个免费域名 可以用来做测试,如果有备案好的域名当然更好。

     

    没有备案的域名情况,用花生壳 内网穿透测试

    自己注册 会送个免费的域名 然后花6块永久的内网穿透体验版 注册好后,内网穿透配置

     

    配置好后可以诊断测试,确保配置的端口 在运行中,如果是项目的端口项目要处于运行中状态,不然会连接失败

     

    这些都没问题后回到 在公众号内的左边导航找到 公众号设置 ----- 功能设置 --- 网页授权域名 进行域名授权配置。

    一、域名授权需要你下载一个文件放置你的域名根目录下,也就就是你域名访问的项目的根目录下,然后在通过浏览器 域名/文件名.txt 可以访问到文件中的内容,这个是重点一定要可以访问的到文件内容,然后在去网页授权域名绑定域名保存就好。配置以后此域名下面的页面http://www.qq.com/music.html 、 http://www.qq.com/login.html 都可以进行OAuth2.0鉴权。但http://pay.qq.com 、 http://music.qq.com 、 http://qq.com无法进行OAuth2.0鉴权

     

    如果公众号登录授权给了第三方开发者来进行管理,则不必做任何设置,由第三方代替公众号实现网页授权即可

     

    二、记住是域名,不是URL。不需要带http。

     

    文件放置项目的根目录或者webapp下,可以通过浏览器  域名/文件名.txt  访问文件内容,也可放置项目的目录下,访问时 域名/目录名/文件名

     

    这里你可能会遇见配置失败 报 找不到这个文件或时文件内容不匹配

    注意看你是否放置根目录下,位置没错。项目是否有拦截器拦截了导致访问不到该文件

     

    以上都都弄好了开始我们重点编码。

     

    微信授权登陆流程:

    登陆授权作用域分为两种:

    一 、静默登陆 scope参数值为 snsapi_base;只能获取到用户openid。好处是静默认证,无需用户手动点击认证按钮,感觉上像是直接进入网站一样。

     

    二、 授权登陆 scope参数值为 snsapi_userinfo;可以获取到openid、昵称、头像、所在地等信息。需要用户手动点击认证按钮

     

     

    授权登陆步骤:

    1、引导用户进入授权页面同意授权,获取code 

    2、通过code换取网页授权access_token(与基础支持中的access_token不同)和openid

    3、通过网页授权access_token和openid获取用户基本信息

     

    一、 微信登陆触发按钮或图片链接

    • 在首页准备一个按钮或者一个链接用来发起请求。

    这里我们用一个链接做示例

     

    1.通过微信接口获取code

    微信获取code接口: https://open.weixin.qq.com/connect/oauth2/authorize?

    参数下表:

    参数

    是否必须

    说明

    appid

    公众号的唯一标识

    redirect_uri

    授权后重定向的回调链接地址,请使用urlencode对链接进行处理

    response_type

    返回类型,请填写code

    scope

    应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)

    state

    重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节 

    #wechat_redirect

    无论直接打开还是做页面302重定向时候,必须带此参数

     

    code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。

     

    Controller控制器:

     

     

     

    微信用户授权确认登陆

    • 第一步登录链接拼好后,在手机微信中打开,微信便会跳转到确认授权页面,点击确认授权即可。(这一步,不用开发者做处理!)
    • 用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。

     

    二、获取 openid

    请求与带携带参数

     

    返回的数据字段

     

    代码

     

    三、获取用户信息

    请求与参数

    返回的JSON数据及字段解释

     

    代码:

     

    最后的 回调请求 回授权成功页面

     

    获取到用户信息可进一步进行业务处理,

     

    成功页面

     

     

     

    结果图

    首页:

     

    用户授权确定登陆:

     

    授权成功:

     

     

    详情也可去看官方文档:https://mp.weixin.qq.com/wiki?action=doc&id=mp1421140842&t=0.2934098934066318#2

     

    展开全文
  • java实现微信登录(SSM)

    万次阅读 2018-03-20 21:15:12
    提醒:本文章可能需要一定的java基础,所需jar包也需要自己寻找效果图:扫描后获取的数据openid:(微信唯一标识)headimgurl:头像nickname:昵称(其他就不列举啦)1.注册微信开放平台开发者账号并创建一个或一个...

    提醒:本文章可能需要一定的java基础,所需jar包也需要自己寻找

    效果图:


    扫描后获取的数据



    openid:(微信唯一标识)

    headimgurl:头像

    nickname:昵称

    (其他就不列举啦)



    1.注册微信开放平台开发者账号并创建一个或一个以上的网站应用



    点击查看进入下图

    2.把授权回调域改成自己的

    授权回调域:域名

    注:花生壳可以免费注册域名,并且映射至外网测试


    3.一个类搞定登录,LoginAction 



    package com.t5.weixin;


    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.net.URLEncoder;


    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;


    import org.apache.http.HttpResponse;
    import org.apache.http.HttpStatus;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.util.EntityUtils;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;


    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
      
    @Controller
    @RequestMapping(value = "/WeCat")
      
    public class LoginAction {


    @RequestMapping(value = "/login")
    public void login(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
    System.out.println("================>>");
    String url = "https://open.weixin.qq.com/connect/qrconnect?";
    url += "appid=你的appid";


    url += "&redirect_uri=" + URLEncoder.encode("http://169l5w4498.imwork.net:16282/WeCat/callBackLogin", "UTF-8");   //此处和微信会调用的域名相同
    url += "&response_type=code&scope=snsapi_login";
    url += "&state=" + request.getSession().getId() + "#wechat_redirect";
    //redirect_uri;指定回调路径
    try {
    response.sendRedirect(url);
    } catch (IOException e) {
    e.printStackTrace();
    }
    }


    @RequestMapping(value = "/callBackLogin")
    public String callBackLogin(HttpServletRequest request, HttpServletResponse response,Model model) {
    System.out.println("callBackLogin....");
    // return "redirect:../loginSuccess.jsp";
    String code = request.getParameter("code");
    String state = request.getParameter("state");
    System.out.println("code=" + code);
    System.out.println("state=" + state);


    String url = "https://api.weixin.qq.com/sns/oauth2/access_token?";
    url += "appid=你的appid";
    url += "&secret=你的secret";


    url += "&code=" + code + "&grant_type=authorization_code";


    JSONObject jsonObject = this.httpGet(url);
    String at = jsonObject.getString("access_token");//获取微信开放平台票据号
    String openId = jsonObject.getString("openid");

    System.out.println("at="+at);

    url="https://api.weixin.qq.com/sns/userinfo?access_token="+at+"&openid="+openId;

    jsonObject = this.httpGet(url);//以json对象格式返回用户数据
    System.out.println("==============>"+jsonObject);
    model.addAttribute("weixin", jsonObject);
    //把用户微信信息保存到数据库(判断这个信息是否存在,如果不存在,新增到数据库表(自动创建一个用户),如果已存在,直接登录成功)

    return "index";
    }


    /**
    * ����get���� http://www.cnblogs.com/QQParadise/articles/5020215.html

    * @param url
    * @return
    */
    public JSONObject httpGet(String url) {
    JSONObject jsonResult = null;
    try {
    DefaultHttpClient client = new DefaultHttpClient();
    HttpGet request = new HttpGet(url);
    HttpResponse response = client.execute(request);
    if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
    String strResult = EntityUtils.toString(response.getEntity(),"UTF-8");  //此处设定编码格式
    jsonResult = JSON.parseObject(strResult);
    System.out.println("strResult=" + strResult);
    } else {
    System.out.println("*******************");
    }
    } catch (IOException e) {
    e.printStackTrace();
    }
    return jsonResult;
    }
    }

    此致,调用login方法即可


    展开全文
  • java实现微信登录

    万次阅读 2018-04-08 11:58:01
    首先是微信测试号的配置:这里的token随便写什么都可以,唯一需要注意的就是要和后台使用的一致。url必须是公网的地址,微信会发一些数据来测试这个接口,这个时候你需要在后台接受这个数据并...
  • java实现第三方微信登录

    千次阅读 热门讨论 2019-10-21 16:59:11
    使用微信进行第三方登录总共分为三步; 1.获取code 1). 首先展示二维码,让用户进行扫描授权 两种方式: 直接使用a标签进行链接二维码 我们要填写的信息有: appId(微信开发平台创建应用后提供) redirect_uri(回...
  • JAVA微信扫码登录

    千次阅读 2020-05-23 14:00:57
    JAVA微信登录 在进行JAVA微信登录之前,先认真看一下官方文档 准备工作 网站应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统。 在进行微信OAuth2.在进行微信OAuth2.0授权登录接入之前,在...
  • JAVA微信扫码支付模式一功能实现

    万次阅读 多人点赞 2016-09-27 12:58:33
    一、准备工作4月份那会发了篇关于 JAVA微信扫码支付模式二功能实现的博客,无数人来追问模式一的开发,所以在这就贴出来,仅供参考。关于模式一和模式二的区别,我有解释过很多次,无非就是模式一的二维码是针对...
  • 求能用的案例 java微信支付jsapi的java微信支付jsapi的
  • Java微信分享接口开发

    万次阅读 热门讨论 2019-08-06 17:31:14
    Java微信分享,步骤是 1、根据当前的url,获取signature,nonceStr,timestamp 和appId。 2、通过signature,nonceStr,timestamp 和appId来配置微信 wx.config。 3、通过wx.ready实现微信分享功能。
  • 接上一篇Java微信支付-申请退款API,本篇在上篇文章的基础上讲述调用申请退款API后退款成功之后微信异步回调通知 下文中所需配置、类都在以请查看以上链接内容。 在调用微信支付-统一下单API时,会传递notify_url...
  • java 微信发送消息

    2020-07-30 23:30:25
    java 微信发送消息 http://ip地址/ajie-wechat/checkWechat
  • Java微信支付-支付成功异步回调验签

    千次阅读 2019-10-14 10:25:39
    接上一篇Java微信支付-统一下单API,本篇在上篇文章的基础上讲述统一下单支付成功之后微信异步回调通知 在调用微信支付-统一下单API时,会传递notify_url这个参数给微信,这个参数是用户成功支付之后微信端会向此...
  • java微信卡卷开发(1)

    千次阅读 热门讨论 2017-11-23 18:45:49
    java微信卡卷创建每次使用微信给的API都忍不住想吐槽下,巨坑,天坑,真的坑。每次都需要花费好多时间来自己整理。这次因为项目需求,使用上了微信卡卷的功能,调试过程就不用了说了,都是泪。还是直接讲一下自己的...
  • 关于java微信授权登录功能,Java后台获取微信用户信息 背景:想要在微信上拉取用户头像 问题:已解决 最近用到了微信授权登录,在网上扒了一大堆帖子,大部分一样,要不就是不全,好不容易找到不错的也不太适合,就...
  • JAVA微信支付退款接口demo 应用场景 当交易发生之后一段时间内,由于买家或者卖家的原因需要退款时,卖家可以通过退款接口将支付款退还给买家,微信支付将在收到退款请求并且验证成功之后,按照退款规则将支付款按...
  • java微信支付接入详细流程 亲测

    万次阅读 多人点赞 2016-09-26 15:09:31
    由于项目是采用java编写的,微信包括微信支付大都是php相关,于是微信支付官方文档对java的支持就不是很友好,在网上找了很多文章,基本上没有一篇是真正跑的通的,经过一番整理,先将java接入微信支付详细流程总结...
  • 手把手教你--JAVA微信支付(公众号支付JSAPI)

    万次阅读 多人点赞 2019-08-26 17:54:15
    JAVA开发微信支付-公众号支付/微信浏览器支付(JSAPI) 写这篇文章的目的有2个,一是自己的项目刚开发完微信支付功能,趁热回个炉温习一下,二也是帮助像我这样对微信支付不熟悉,反复看了多天文档还是一知半解,原理都...
  • JAVA微信扫码支付模式二功能实现以及回调

    万次阅读 多人点赞 2017-06-08 10:55:22
    一、准备工作首先吐槽一下微信关于支付这块,本身支持的支付模式就好几种,但是官方文档特别零散,连像样的JAVA相关的demo也没几个。本人之前没有搞过微信支付,一开始真是被它搞晕,折腾两天终于调通了,特此写下来...
1 2 3 4 5 ... 20
收藏数 183,289
精华内容 73,315
关键字:

java微信