精华内容
参与话题
问答
  • 第三方平台

    2017-07-21 10:57:00
    5成功一步 申请使用 1首先登陆网站http://open.51094.com/ 点击右上角登陆按钮进行登陆的登陆成功后会自动跳转到管理中心进入管理中心页面创建应用1 2选择应用类型为网站应用完成后跳转至应用信息天蝎页面 3 ...

     

    首先我们先看一下流程

    1网站申请使用

    2网站引入js,

    3网站自动显示qq微博人人网登陆

    4处理登陆成功回调

    5成功
    第一步

    申请使用 1首先登陆网站http://open.51094.com/

    点击右上角登陆按钮进行登陆的登陆成功后会自动跳转到管理中心进入管理中心页面创建应用1

    2选择应用类型为网站应用完成后跳转至应用信息天蝎页面

    3

    在要实现登陆的页面

    引入js文件
    地址为
    上面的地址

    在当前页面写入带有id="hzy_fast_login"的标签元素

     

     

     

     

    转载于:https://www.cnblogs.com/langjunnan/p/7216591.html

    展开全文
  • 第一部分:微信第三方平台配置 主要的URL配置(参考如下): 登录授权的发起页域名 www.jeewx.com 授权事件接收URL http://www.jeewx.com/jeewx/rest/openwx/e...

    源码下载: https://gitee.com/jeecg/jeewx-boot

    第一部分:微信第三方平台配置

     

     

    主要的URL配置(参考如下):

     

    登录授权的发起页域名

    www.jeewx.com

    授权事件接收URL

    http://www.jeewx.com/jeewx/rest/openwx/event/authorize

    公众号消息与事件接收URL

    http://www.jeewx.com/jeewx/rest/openwx/$APPID$/callback

     

     

     

     

    第二部分:微信公众账号第三方平台全网发布源码(java)- 实战测试通过

     

    package org.jeecgframework.web.rest.controller;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.util.Arrays;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.lang.StringUtils;
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.DocumentHelper;
    import org.dom4j.Element;
    import org.jeecgframework.core.util.LogUtil;
    import org.jeecgframework.core.util.ResourceUtil;
    import org.jeecgframework.core.util.oConvertUtils;
    import org.jeecgframework.web.system.service.SystemService;
    import org.jeewx.api.core.exception.WexinReqException;
    import org.jeewx.api.mp.aes.AesException;
    import org.jeewx.api.mp.aes.WXBizMsgCrypt;
    import org.jeewx.api.third.JwThirdAPI;
    import org.jeewx.api.third.model.ApiComponentToken;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import weixin.open.entity.base.WeixinOpenAccountEntity;
    
    /**
     * 微信公众账号第三方平台全网发布源码(java)
     * @author: jeewx开源社区
     * @网址:www.jeewx.com
     * @论坛:www.jeecg.org
     * @date 20150801
     */
    @Controller
    @RequestMapping("/openwx")
    public class OpenwxController {
    
    	
    	
    	private final String APPID = "???";
    	
    	
    	/**
    	 * 微信全网测试账号
    	 */
    	private final static String COMPONENT_APPID = "???";
    	private final String COMPONENT_APPSECRET = "???";
    	private final static String COMPONENT_ENCODINGAESKEY = "?????";
    	private final static String COMPONENT_TOKEN = "?????";
    	@Autowired
    	private SystemService systemService;
    	
    	
    	 /**
         * 授权事件接收
         * 
         * @param request
         * @param response
         * @throws IOException
         * @throws AesException
         * @throws DocumentException
         */
        @RequestMapping(value = "/event/authorize")
        public void acceptAuthorizeEvent(HttpServletRequest request, HttpServletResponse response) throws IOException, AesException, DocumentException {
    //    	 LogUtil.info("微信第三方平台---------微信推送Ticket消息10分钟一次-----------"+ DataUtils.getDataString(DataUtils.yyyymmddhhmmss));
        	 processAuthorizeEvent(request);
             output(response, "success"); // 输出响应的内容。
        }
        
        @RequestMapping(value = "/authorCallback")
        public void authorCallback(HttpServletRequest request, HttpServletResponse response) throws IOException, AesException, DocumentException {
        	String auth_code = request.getParameter("auth_code");
        	String expires_in = request.getParameter("auth_code");
        	
        }
        
        
        /**
         * 一键授权功能
         * @param request
         * @param response
         * @throws IOException
         * @throws AesException
         * @throws DocumentException
         */
        @RequestMapping(value = "/goAuthor")
        public void goAuthor(HttpServletRequest request, HttpServletResponse response) throws IOException, AesException, DocumentException {
        	ApiComponentToken apiComponentToken = new ApiComponentToken();
        	apiComponentToken.setComponent_appid(COMPONENT_APPID);
        	apiComponentToken.setComponent_appsecret(COMPONENT_APPSECRET);
        	WeixinOpenAccountEntity  entity = getWeixinOpenAccount(APPID);
        	apiComponentToken.setComponent_verify_ticket(entity.getTicket());
        	try {
    			String component_access_token = JwThirdAPI.getAccessToken(apiComponentToken);
    			//预授权码
    			String preAuthCode = JwThirdAPI.getPreAuthCode(COMPONENT_APPID, component_access_token);
    			String url = "https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid="+COMPONENT_APPID+"&pre_auth_code="+preAuthCode+"&redirect_uri="+ResourceUtil.getConfigByName("domain")+"/rest/openwx/authorCallback";
    			response.sendRedirect(url);
    		} catch (WexinReqException e) {
    			e.printStackTrace();
    		}
        	
        }
        
        
        
        @RequestMapping(value = "{appid}/callback")
        public void acceptMessageAndEvent(HttpServletRequest request, HttpServletResponse response) throws IOException, AesException, DocumentException {
            String msgSignature = request.getParameter("msg_signature");
            //LogUtil.info("第三方平台全网发布-------------{appid}/callback-----------验证开始。。。。msg_signature="+msgSignature);
            if (!StringUtils.isNotBlank(msgSignature))
                return;// 微信推送给第三方开放平台的消息一定是加过密的,无消息加密无法解密消息
     
            StringBuilder sb = new StringBuilder();
            BufferedReader in = request.getReader();
            String line;
            while ((line = in.readLine()) != null) {
                sb.append(line);
            }
            in.close();
     
            String xml = sb.toString();
            Document doc = DocumentHelper.parseText(xml);
            Element rootElt = doc.getRootElement();
            String toUserName = rootElt.elementText("ToUserName");
     
            //微信全网测试账号
    //        if (StringUtils.equalsIgnoreCase(toUserName, APPID)) {
    //           LogUtil.info("全网发布接入检测消息反馈开始---------------APPID="+ APPID +"------------------------toUserName="+toUserName);
               checkWeixinAllNetworkCheck(request,response,xml);
    //        }
        }
        
        /**
         * 处理授权事件的推送
         * 
         * @param request
         * @throws IOException
         * @throws AesException
         * @throws DocumentException
         */
        public void processAuthorizeEvent(HttpServletRequest request) throws IOException, DocumentException, AesException {
            String nonce = request.getParameter("nonce");
            String timestamp = request.getParameter("timestamp");
            String signature = request.getParameter("signature");
            String msgSignature = request.getParameter("msg_signature");
     
            if (!StringUtils.isNotBlank(msgSignature))
                return;// 微信推送给第三方开放平台的消息一定是加过密的,无消息加密无法解密消息
            boolean isValid = checkSignature(COMPONENT_TOKEN, signature, timestamp, nonce);
            if (isValid) {
                StringBuilder sb = new StringBuilder();
                BufferedReader in = request.getReader();
                String line;
                while ((line = in.readLine()) != null) {
                    sb.append(line);
                }
                String xml = sb.toString();
    //            LogUtil.info("第三方平台全网发布-----------------------原始 Xml="+xml);
                String encodingAesKey = COMPONENT_ENCODINGAESKEY;// 第三方平台组件加密密钥
                String appId = getAuthorizerAppidFromXml(xml);// 此时加密的xml数据中ToUserName是非加密的,解析xml获取即可
                //LogUtil.info("第三方平台全网发布-------------appid----------getAuthorizerAppidFromXml(xml)-----------appId="+appId);
                WXBizMsgCrypt pc = new WXBizMsgCrypt(COMPONENT_TOKEN, encodingAesKey, COMPONENT_APPID);
                xml = pc.decryptMsg(msgSignature, timestamp, nonce, xml);
    //            LogUtil.info("第三方平台全网发布-----------------------解密后 Xml="+xml);
                processAuthorizationEvent(xml);
            }
        }
        
        /**
         * 保存Ticket
         * @param xml
         */
        void processAuthorizationEvent(String xml){
        	Document doc;
    		try {
    			doc = DocumentHelper.parseText(xml);
    			Element rootElt = doc.getRootElement();
    			String ticket = rootElt.elementText("ComponentVerifyTicket");
    			if(oConvertUtils.isNotEmpty(ticket)){
    				LogUtil.info("8、推送component_verify_ticket协议-----------ticket = "+ticket);
    				WeixinOpenAccountEntity  entity = getWeixinOpenAccount(APPID);
    				entity = entity==null?new WeixinOpenAccountEntity():entity;
    				entity.setTicket(ticket);
    				entity.setAppid(APPID);
    				entity.setGetTicketTime(new Date());
    				systemService.saveOrUpdate(entity);
    			}
    		} catch (DocumentException e) {
    			e.printStackTrace();
    		}
        }
        
        /**
         * 获取授权账号信息
         * @param appid
         * @return
         */
        WeixinOpenAccountEntity getWeixinOpenAccount(String appid){
        	WeixinOpenAccountEntity  entity = null;
    		List<WeixinOpenAccountEntity> ls = systemService.findByProperty(WeixinOpenAccountEntity.class, "appid", appid);
    		if(ls!=null && ls.size()!=0){
    			 entity = ls.get(0);
    		}
    		return entity;
        }
        
        /**
         * 获取授权的Appid
         * @param xml
         * @return
         */
    	String getAuthorizerAppidFromXml(String xml) {
    		Document doc;
    		try {
    			doc = DocumentHelper.parseText(xml);
    			Element rootElt = doc.getRootElement();
    			String toUserName = rootElt.elementText("ToUserName");
    			return toUserName;
    		} catch (DocumentException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return null;
    	}
       
        
        public void checkWeixinAllNetworkCheck(HttpServletRequest request, HttpServletResponse response,String xml) throws DocumentException, IOException, AesException{
            String nonce = request.getParameter("nonce");
            String timestamp = request.getParameter("timestamp");
            String msgSignature = request.getParameter("msg_signature");
     
            WXBizMsgCrypt pc = new WXBizMsgCrypt(COMPONENT_TOKEN, COMPONENT_ENCODINGAESKEY, COMPONENT_APPID);
            xml = pc.decryptMsg(msgSignature, timestamp, nonce, xml);
     
            Document doc = DocumentHelper.parseText(xml);
            Element rootElt = doc.getRootElement();
            String msgType = rootElt.elementText("MsgType");
            String toUserName = rootElt.elementText("ToUserName");
            String fromUserName = rootElt.elementText("FromUserName");
     
    //        LogUtil.info("---全网发布接入检测--step.1-----------msgType="+msgType+"-----------------toUserName="+toUserName+"-----------------fromUserName="+fromUserName);
    //        LogUtil.info("---全网发布接入检测--step.2-----------xml="+xml);
            if("event".equals(msgType)){
    //        	 LogUtil.info("---全网发布接入检测--step.3-----------事件消息--------");
            	 String event = rootElt.elementText("Event");
    	         replyEventMessage(request,response,event,toUserName,fromUserName);
            }else if("text".equals(msgType)){
    //        	 LogUtil.info("---全网发布接入检测--step.3-----------文本消息--------");
            	 String content = rootElt.elementText("Content");
    	         processTextMessage(request,response,content,toUserName,fromUserName);
            }
        }
        
        
        public void replyEventMessage(HttpServletRequest request, HttpServletResponse response, String event, String toUserName, String fromUserName) throws DocumentException, IOException {
            String content = event + "from_callback";
    //        LogUtil.info("---全网发布接入检测------step.4-------事件回复消息  content="+content + "   toUserName="+toUserName+"   fromUserName="+fromUserName);
            replyTextMessage(request,response,content,toUserName,fromUserName);
        }
     
        public void processTextMessage(HttpServletRequest request, HttpServletResponse response,String content,String toUserName, String fromUserName) throws IOException, DocumentException{
            if("TESTCOMPONENT_MSG_TYPE_TEXT".equals(content)){
                String returnContent = content+"_callback";
                replyTextMessage(request,response,returnContent,toUserName,fromUserName);
            }else if(StringUtils.startsWithIgnoreCase(content, "QUERY_AUTH_CODE")){
                output(response, "");
                //接下来客服API再回复一次消息
                replyApiTextMessage(request,response,content.split(":")[1],fromUserName);
            }
        }
     
        public void replyApiTextMessage(HttpServletRequest request, HttpServletResponse response, String auth_code, String fromUserName) throws DocumentException, IOException {
            String authorization_code = auth_code;
            // 得到微信授权成功的消息后,应该立刻进行处理!!相关信息只会在首次授权的时候推送过来
            System.out.println("------step.1----使用客服消息接口回复粉丝----逻辑开始-------------------------");
            try {
            	ApiComponentToken apiComponentToken = new ApiComponentToken();
            	apiComponentToken.setComponent_appid(COMPONENT_APPID);
            	apiComponentToken.setComponent_appsecret(COMPONENT_APPSECRET);
            	WeixinOpenAccountEntity  entity = getWeixinOpenAccount(APPID);
            	apiComponentToken.setComponent_verify_ticket(entity.getTicket());
            	String component_access_token = JwThirdAPI.getAccessToken(apiComponentToken);
            	
            	System.out.println("------step.2----使用客服消息接口回复粉丝------- component_access_token = "+component_access_token + "---------authorization_code = "+authorization_code);
            	net.sf.json.JSONObject authorizationInfoJson = JwThirdAPI.getApiQueryAuthInfo(COMPONENT_APPID, authorization_code, component_access_token);
            	System.out.println("------step.3----使用客服消息接口回复粉丝-------------- 获取authorizationInfoJson = "+authorizationInfoJson);
            	net.sf.json.JSONObject infoJson = authorizationInfoJson.getJSONObject("authorization_info");
            	String authorizer_access_token = infoJson.getString("authorizer_access_token");
            	
            	
            	Map<String,Object> obj = new HashMap<String,Object>();
            	Map<String,Object> msgMap = new HashMap<String,Object>();
            	String msg = auth_code + "_from_api";
            	msgMap.put("content", msg);
            	
            	obj.put("touser", fromUserName);
            	obj.put("msgtype", "text");
            	obj.put("text", msgMap);
            	JwThirdAPI.sendMessage(obj, authorizer_access_token);
    		} catch (WexinReqException e) {
    			e.printStackTrace();
    		}
            
        }   
        
        /**
         * 验证是否过期
         * @param accessTokenExpires
         * @return
         */
        boolean isExpired(long accessTokenExpires){
    		return false;
        }
        
        /**
         * 回复微信服务器"文本消息"
         * @param request
         * @param response
         * @param content
         * @param toUserName
         * @param fromUserName
         * @throws DocumentException
         * @throws IOException
         */
        public void replyTextMessage(HttpServletRequest request, HttpServletResponse response, String content, String toUserName, String fromUserName) throws DocumentException, IOException {
            Long createTime = Calendar.getInstance().getTimeInMillis() / 1000;
            StringBuffer sb = new StringBuffer();
            sb.append("<xml>");
    		sb.append("<ToUserName><![CDATA["+fromUserName+"]]></ToUserName>");
    		sb.append("<FromUserName><![CDATA["+toUserName+"]]></FromUserName>");
    		sb.append("<CreateTime>"+createTime+"</CreateTime>");
    		sb.append("<MsgType><![CDATA[text]]></MsgType>");
    		sb.append("<Content><![CDATA["+content+"]]></Content>");
    		sb.append("</xml>");
    		String replyMsg = sb.toString();
            
            String returnvaleue = "";
            try {
                WXBizMsgCrypt pc = new WXBizMsgCrypt(COMPONENT_TOKEN, COMPONENT_ENCODINGAESKEY, COMPONENT_APPID);
                returnvaleue = pc.encryptMsg(replyMsg, createTime.toString(), "easemob");
    //            System.out.println("------------------加密后的返回内容 returnvaleue: "+returnvaleue);
            } catch (AesException e) {
                e.printStackTrace();
            }
            output(response, returnvaleue);
        }
        
        
        public static void main(String[] args) {
        	 Long createTime = Calendar.getInstance().getTimeInMillis() / 1000;
        	 String replyMsg = "LOCATIONfrom_callback";
        	 
             String returnvaleue = "";
             try {
                 WXBizMsgCrypt pc = new WXBizMsgCrypt(COMPONENT_TOKEN, COMPONENT_ENCODINGAESKEY, COMPONENT_APPID);
                 returnvaleue = pc.encryptMsg(replyMsg, createTime.toString(), "easemob");
                 System.out.println(returnvaleue);
             } catch (AesException e) {
                 e.printStackTrace();
             }
    	}
        /**
         * 工具类:回复微信服务器"文本消息"
         * @param response
         * @param returnvaleue
         */
        public void output(HttpServletResponse response,String returnvaleue){
    		try {
    			PrintWriter pw = response.getWriter();
    			pw.write(returnvaleue);
    //			System.out.println("****************returnvaleue***************="+returnvaleue);
    			pw.flush();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
        }
        
        /**
         * 判断是否加密
         * @param token
         * @param signature
         * @param timestamp
         * @param nonce
         * @return
         */
        public static boolean checkSignature(String token,String signature,String timestamp,String nonce){
            System.out.println("###token:"+token+";signature:"+signature+";timestamp:"+timestamp+"nonce:"+nonce);
        	   boolean flag = false;
        	   if(signature!=null && !signature.equals("") && timestamp!=null && !timestamp.equals("") && nonce!=null && !nonce.equals("")){
        	      String sha1 = "";
        	      String[] ss = new String[] { token, timestamp, nonce }; 
                  Arrays.sort(ss);  
                  for (String s : ss) {  
                   sha1 += s;  
                  }  
         
                  sha1 = AddSHA1.SHA1(sha1);  
         
                  if (sha1.equals(signature)){
            	   flag = true;
                  }
        	   }
        	   return flag;
           }
    }
    
    
    class AddSHA1 {
        public static String SHA1(String inStr) {
            MessageDigest md = null;
            String outStr = null;
            try {
                md = MessageDigest.getInstance("SHA-1");     //选择SHA-1,也可以选择MD5
                byte[] digest = md.digest(inStr.getBytes());       //返回的是byet[],要转化为String存储比较方便
                outStr = bytetoString(digest);
            }
            catch (NoSuchAlgorithmException nsae) {
                nsae.printStackTrace();
            }
            return outStr;
        }
        
        
        public static String bytetoString(byte[] digest) {
            String str = "";
            String tempStr = "";
            
            for (int i = 0; i < digest.length; i++) {
                tempStr = (Integer.toHexString(digest[i] & 0xff));
                if (tempStr.length() == 1) {
                    str = str + "0" + tempStr;
                }
                else {
                    str = str + tempStr;
                }
            }
            return str.toLowerCase();
        }
    }
    

     

     

     

     

    (更多资料,关注论坛:www.jeecg.org

    技术交流QQ群:289709451、287090836

     

     

     

    展开全文
  • //获取第三方平台信息 $open = config("open"); //获取第三方平台操作对象 $openPlatform = Factory::openPlatform($open); //组通知链接URL $url = "http://www.baidu.com"; 获取授权二维码链接 $url = $open...

    EasyWeChat SDK

    获取授权url

    //获取第三方平台信息
    $open = config("open");
    //获取第三方平台操作对象
    $openPlatform = Factory::openPlatform($open);
    //组通知链接URL
    $url = "http://www.baidu.com";
    获取授权二维码链接
    $url = $openPlatform->getPreAuthorizationUrl($url);
    

    跳转到授权链接,使用微信扫描授权二维码
    授权页面
    扫码之后选择需要授权的公众号并选择需要授权的权限。

    处理授权回调

    //获取授权码
    $auth_code = $_POST["auth_code"];
    //授权解密
    $authorize = $openPlatform->hanleAuthorize($auth_code);
    //获取授权账号信息
    $authorizerData = $openPlatform->getAuthorizer($authorize["authorization_info"]["authorizer_appid"]);
    //保存授权账号信息到数据库,丢失后需要重新获取
    //组装数据
    $data = [
        "appid"                    => $this->handleAuthorize["authorization_info"]["authorizer_appid"],
        "authorizer_refresh_token" => $this->handleAuthorize["authorization_info"]["authorizer_refresh_token"],
        "verify_type"              => $this->getAuthorizer["authorizer_info"]["verify_type_info"]["id"] >= 0 ? 1 : 0,
    ];
    

    authorizer_appid和authorizer_refresh_token是重点,必须保存,代公众号发起授权、自定义菜单等所有功能都需要用到这两个参数。

    取消授权

    // 处理授权取消事件
    $this->openPlatform->server->push(function ($message) {
        	//修改自己的数据库配置 可删除可修改,看个人怎么编写
        	$editConfig = Config->where()->delete();
            #判断成功还是失败 并记录日志
            if ($editConfig === false) {
                file_put_contents("authorize_unbind_false.log", "appId:" . $message["AuthorizerAppid"] . "\r\n", FILE_APPEND);
            } else {
                file_put_contents("authorize_unbind_true.log", "appId:" . $message["AuthorizerAppid"] . "\r\n", FILE_APPEND);
            }
    }, Guard::EVENT_UNAUTHORIZED);
    return $this->openPlatform->server->serve();
    

    文章中提到的$openPlatform

    //获取第三方平台配置信息
    $open = config("open");
    //获取第三方平台操作对象
    $openPlatform = Factory::openPlatform($open);
    

    公众号授权成功以后会根据第三方平台配置的链接每十分钟访问一次,并发送票据,代公众号实现业务用。
    验证票据

    展开全文
  • 一些常用的第三方平台和开放平台

    千次阅读 2018-12-21 21:38:19
    当然,有时候也可以自己做,但是考虑到效率和时间以及人工成本,第三方无疑是较好的选择。 钱相关的 首先,当然也是最重要的,那就是钱和支付这一块了。 一 、 微信支付,支付宝支付 当下微信支付和支付宝支付无疑是...

    概述

    我们在平时开发做项目时,经常需要做一些需要请求第三方才能完成的需求。当然,有时候也可以自己做,但是考虑到效率和时间以及人工成本,第三方无疑是较好的选择。

    钱相关的

    首先,当然也是最重要的,那就是钱和支付这一块了。
    一 、 微信支付,支付宝支付
    当下微信支付和支付宝支付无疑是最火热的支付方式了,因为基本都是大同小异,所以这里就列举一下微信支付。在百度输入微信开放平台,就可以进入官网。首先要经过复杂的申请和审核之后,就可以参照官网的API和Demo开发了。微信传输用XML的形式,而支付宝使用json。
    在这里插入图片描述

    如果觉得这哥俩比较复杂,可以使用其他第三方的支付方式
    这里推荐一款比较好用的

    二、 YeePay易宝支付
    打开官网下载文档和相关文件,笔者之前下载并使用过就拿之前的举例了。
    在这里插入图片描述
    解压完YeePay文件夹里边还有各种编程语言的demo供开发者参考使用,内容写的很详细,非常人性化。
    在这里插入图片描述
    按着文档和API一步一步来,就可以逐步完成支付了,笔者这里就拿一个真实的场景来演示一下,也是在项目中遇到的支付场景。

    下图是在界面中的支付部分,1区域 选择银行可以通过单选框来确定选中的银行参数,也可以通过2中的银行下拉框来选择。
    2区域 可以填入交易相关的参数。

    在这里插入图片描述

    点击提交后,会跳转到银行支付的界面。
    1–4处对参数都是我们在界面2区域输入的参数值,3处的订单号可以自动生成。 5处的银行名称是我们在界面1区域或者2区域的下拉框确定的。
    在这里插入图片描述
    到了这里,我们的交易已经接近尾声了,仅仅是用一些官网提供的工具类和API文档完成了这些工作。

    下面截取一下文档中给出的交易需要提供的相关参数
    在这里插入图片描述

    IM开放平台

    即时通讯平台,可以做企业的音频视频会议,云和AI,短信验证和通知,流量资源和分发,还有大数据的一些业务。具体的大家可以去官网看介绍和文档,下面给大家推荐一下平时用到的而且体验还不错的平台。
    一、 容联.云通讯
    在这里插入图片描述

    二、 环信
    在这里插入图片描述

    数据认证相关

    一、 聚合数据
    在这里插入图片描述
    接下来是它的服务内容,囊括很多领域,具体可以去官网看。
    在这里插入图片描述
    笔者在开发时,使用过其中的 短信验证码验证、语音验证码验证、天气预报查询、二维码生成、身份证实名认证,包括ocr图像识别技术,这个ocr做的还是很好的,把身份证正反面照片按着文档要求的参数上传,按返回的参数接收返回数据,就可以自动识别出姓名,性别,身份证号码,地址等信息,省去了大量人力和时间成本。

    地图相关

    只要按着文档要求,参照着demo去做就可以。
    一、 百度地图开放平台
    在界面显示用js就可以完成,笔者在使用的时候,只要从平台注册拿到ak就可以开始了,很快就达到了预期的目的。

    二维码生成平台

    一、草料二维码
    在这里插入图片描述
    我们可以生成各式各样的自定义二维码。内容也是可以自定义的。所以这里面就有一些非法操作的风险。扫码有风险,扫码需谨慎
    当你扫到了不安全的二维码,会把你所有的信息包括银行卡的全都泄露给二维码的作者。所以大家一定要谨慎, 避免被利用了爱贪小便宜的心理。

    总结

    这些为我们提供便利的第三方平台和产品有很多,只要我们耐心下来,参照着文档和demo基本都可以实现想要的功能,无非就是传参数的个数和形式有所区别。
    但问题就是有时会带来安全和信息泄露的风险,所以建议大家尽量选择有安全保障的公司和平台。

    展开全文
  • WPF开发教程 ----WPF C# 编程 界面开发(很不错)

    千次下载 热门讨论 2010-07-25 18:54:00
    WPF开发教程.rar 目录 WPF基础入门 3 1. WPF基础之体系结构 3 2. WPF基础之XAML 9 3. WPF基础之基元素 23 ...4. WPF维图形应用 219 5. WPF维变换应用 229 6. WPF的动画开发 238 7. WPF的多媒体开发 250
  • * 学C#和WPF编的一个软件,整个编程过程,通过百度不断学习 * 作者是做硬件的,只为学习做简单的上位机程序,C#简单,开发效率高,所以选择C# * 以前没有PC端软件编程经验,所以该编程思想继承于单片机编程思想...
  • WPF界面设计

    千次下载 热门讨论 2012-05-13 20:02:47
    模仿金山卫士,360卫士,鲁大师等软件界面 完整源码奉上,一起学习,需要的来下载吧!
  • WPF经典教程之WPF体系结构

    千次下载 热门讨论 2014-10-03 12:35:07
    WPF的基础的体系结构 所引用的Assembly如下图所示: 关系图中的PresentationFramework PresentationCore 和 milcore是 WPF 的主要代码部分 在这些组件中 只有一个是非托管组件 – milcore milcore 是以非托管代码...
  • WPF仿360卫士9.0界面设计

    千次下载 热门讨论 2013-07-01 15:19:55
    WPF仿360卫士9.0界面设计 http://www.cnblogs.com/bdstjk/
  • WPF

    千次阅读 2017-10-10 10:44:03
    知乎:为什么很少看到使用WPF开发的流行的应用程序呢? 因为wpf一点都不棒,你不要看了个tutorial,getting started教程,写了个todo list,就觉得xaml布局很强大,binding很牛逼,写到大型应用你就会发现,坑...
  • WPF分页DataGrid

    千次下载 热门讨论 2012-05-29 15:30:31
    最近用到WPF的表格控件,需要使用分页功能,找了很多例子都不是很满意。有些是模仿SL做的DataPager导航条,使用的时候还要和DataGrid组合使用,不是很方便。最好还是继承DataGrid的分页表格控件。 于是自己动手封装...
  • WPF Resource资源

    千次阅读 2015-04-10 06:25:52
    WPF不但支持程序级的传统资源,同时还推出了独具特色的对象级资源,每个界面元素都可以携带自己的资源并可被自己的子级元素共享。比如后面的章节我们会讲到模板、程序样式和主题就经常放在对象资源里面。这样一来,...
  • WPF自定义控件开发Sample

    千次下载 热门讨论 2014-10-15 08:35:25
    一个关于WPF自定义开发的小例子 13份WPF经典开发教程 http://download.csdn.net/album/detail/1115 C#资料合辑二[C#桌面编程入门篇] http://download.csdn.net/album/detail/957 C#资料合辑一[C#入门篇] ...
  • WPF Event事件

    千次阅读 2015-04-06 18:05:32
    1.1 逻辑树与可视树 ...如果我们把WPF中的控件也放在显微镜下观察,你会发现WPF控件本身也是一棵由更细微级别的组件(他们不是控件,而是一些可视化组件,派生至Visual类)组成的树。  在WPF中有两种
  • "后山见! WPF就比winform好!激情对决"之总结篇。
  • wpf 圆形菜单

    千次下载 热门讨论 2014-02-26 00:58:19
    wpf 圆形菜单 详细解说: http://www.cnblogs.com/ExMan/admin/EditPosts.aspx?postid=3567474&update=1
  • WPF经典教程之WPF应用程序管理

    千次下载 热门讨论 2014-10-05 00:28:49
    一、WPF应用程序由System.Windows.Application类进行管理 二、创建WPF应用程序 创建WPF应用程序有两种方式: 1、Visual Studio和Expression Blend默认的方式,使用App.xaml文件定义启动应用程序 App.xaml文件的内容...
  • MFC中调用WPF教程

    万次阅读 热门讨论 2010-05-07 00:07:00
    呵呵, 这几天看到社区里大家对如何在vc中调用WPF兴致很高, 现在我就带领大家按部就班来实现它.废话不说了, 开始. WPF是微软主推的新一代桌面程序开发技术, 它极大加快了程序界面开发,也增强了界面的用户体验,至于...
  • WPF - 第三方控件

    千次阅读 2010-09-07 17:17:00
    WPF - 第三方控件 目前第三方控件在网上形成巨大的共享资源,其中包括收费的也有免费的,有开源的也有不开源的,合理的使用第三方控件将使项目组的工作事半功倍。比如项目中有些复杂的业务逻辑、有些绚丽的效果需要...
  • WPF经典教程之Canvas、InkCanvas布局

    千次下载 热门讨论 2014-10-05 00:45:06
    WPF中子元素的绝对定位的布局控件 其子元素使用Width、Height定义元素的宽度和高度 使用Convas.Left(Convas.Right)、Convas.Top(Convas.Bottom)定义与Convas容器的相对位置..... (更多资源:...
  • WPF经典教程之[11]键盘输入、鼠标输入、焦点处理

    千次下载 热门讨论 2014-10-05 01:11:42
    WPF提供了基础的键盘类(System.Input.Keyboard类),该类提供与键盘相关的事件、方法和属性,这些事件、方法和属性提供有关键盘状态的信息。Keyboard的事件也通过UIElement等XAML基元素类的事件向外提供。 对于键盘...
  • WPF主题包(20款不同风格的皮肤)

    千次下载 热门讨论 2011-10-14 14:57:28
    20多款WPF主题皮肤样式,包含使用示例和代码,可轻松实现换肤,也可将样式代码复制到自己程序的资源文件中
  • WPF经典教程之依赖项属性和路由事件

    千次下载 热门讨论 2014-10-05 01:10:07
    Windows Presentation Foundation (WPF) 提供了一组服务,这些服务可用于扩展公共语言运行时 (CLR) 属性的功能。这些服务通常统称为 WPF 属性系统。由 WPF 属性系统支持的属性称为依赖项属性。本概述介绍 WPF 属性...
  • 深入浅出WPF(1)——什么是WPF

    万次阅读 热门讨论 2008-05-15 19:06:00
    回顾一下两个月的学习历程,有两个感觉——一,WPF是一项非常实用又简单易学的东西,它将成为未来MS平台上快速开发的主流趋势;二,WPF的学习比较讲求路径,如果没有一个比较好的路径,学习起来可能比较慢,主要...
  • WPF全系列事例代码

    千次下载 热门讨论 2012-11-17 17:01:56
    WPF基础教程所有相关的源代码,博客文章请查阅:http://blog.csdn.net/fwj380891124 之WPF板块类容。非常详细的介绍了WPF,适合初学者入门学习。
  • WPF 托盘显示

    千次阅读 2019-06-29 09:24:59
    本文告诉大家如何在 WPF 实现在托盘显示,同时托盘可以右击打开菜单,双击执行指定的代码
  • WPF和WinForm技术有什么区别?哪个更加有前景?

    万次阅读 多人点赞 2019-03-19 22:12:03
    1、 结果来说,属于两套界面渲染方式。一个是对传统windows界面元素的封装,通过gdi绘制。另一个是全新的dx渲染绘制的...对初级以上开发人员来说,wpf需要学习xaml,有全新的ui描述语言,特别是可以通过模板的嵌套...
  • WPF项目示例1:入门wpf示例

    千次阅读 2018-01-02 17:27:38
    演示:入门WPF应用程序项目 参考来源Microsoft Help 查看器wpf入门内容下图显示应用了控件、布局、样式、数据绑定和数据模板的 ExpenseIt 应用程序的两个页。 其中包括一个应用程序定义、两个页以及一个图像(未...
  • WPF登录界面

    千次下载 热门讨论 2013-05-26 21:35:34
    WPF界面设计(很帅)+登录验证用户名跟密码固定值123+跳转功能+按钮的键盘快捷键添加(登录用键盘键enter替代)
  • wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例

    千次下载 热门讨论 2009-05-21 11:19:42
    wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf...

空空如也

1 2 3 4 5 ... 20
收藏数 521,145
精华内容 208,458
关键字:

第三方平台