仿京东平台框架开发开放平台(包含需求,服务端代码,SDK代码)

目录
  • 1开放平台需求
    • 1.1调用参数
    • 1.2签名算法
  • 2服务端代码,Java举例
    • 2.1接口入口代码
    • 2.2业务逻辑层
    • 2.3基础工具类
  • 3.SDK代码,Java举例
  • 4.集成SDK,代码举例
  • 5.总结

1开放平台需求

用户需要按照开放平台的协议规范拼装一个正确的URL,通过Https请求到开放平台既能够获取到所需数据。主要流程包含:填写参数、生成签名、拼装HTTPS请求、发起请求、得到响应结果、解析结果。

1.1调用参数


参数名称


参数类型


是否必传


参数描述


method


String



API接口名称


access_token


String



采用OAuth授权方式是必填参数


app_key


String



应用的app_key


sign


String



详见下文“5.签名算法”描述


timestamp


String



时间戳,格式为yyyy-MM-dd HH:mm:ss,例如:2019-05-01 00:00:00。API服务端允许客户端请求时间误差为10分钟


format


String



暂时只支持json


v


String



API协议版本,参考接口文档版本


360buy_param_json


String



需要将应用级参数作为一个整体对象以json的形式拼接传递

应用级参数(更多API应用参数参考 接口文档)

1.2签名算法

为了防止API在调用过程中被恶意者拦截随意篡改,调用API是需要传入签名参数,开放平台服务端会根据请求参数对签名进行验证,判断请求参数是否合法。开放平台签名规则过程如下:

将所有请求参数按照字母先后顺序排列,例如:access_token,app_key,method,timestamp,v,360buy_param_json ,

排序为360buy_param_json,access_token,app_key,method,timestamp,v

把所有参数名和参数值进行拼接,例如:360buy_param_jsonxxxaccess_tokenxxxapp_keyxxxmethodxxxxxxtimestampxxxxxxvx

把appSecret夹在字符串(上一步拼接串)的两端,例如:appSecret+XXXX+appSecret

使用MD5进行加密,再转化成大写。

2服务端代码,Java举例

服务端基于SpringBoot框架编写,入口放在Controller,业务逻辑写在Service。同时考虑安全性和方便排查问题,会加入输入性校验和访问日志。

2.1接口入口代码

接口只有一个入口,即Controller代码如下:

@Controller
public class RouterController {
    @Resource
    private RouterService routerService;
    @Resource
    private OpenApiLogService openApiLogService;
    /**
     * API接口路由器,接口入口
     *
     * @param request
     * @param zrsc_param_json
     * @return
     */
    @RequestMapping(value = "routerjson", method = RequestMethod.POST)
    @ResponseBody
    public String routerjson(HttpServletRequest request, String zrsc_param_json) {
        if (zrsc_param_json==null||"".equals(zrsc_param_json)) {
            return JsonUtils.objToJson(APIMessageVo.fail(APIErrorEnum.FAIL_PARA_LOSE.getCode(), APIErrorEnum
                    .FAIL_PARA_LOSE.getName()));
        }
        APIMessageVo aPIMessageVo=openApiLogService.secrityCheck(request);
        if(aPIMessageVo.isSuccess()){//安全检测成功
            aPIMessageVo=routerService.router(request, zrsc_param_json);
            openApiLogService.insert(request,aPIMessageVo);
        }
        return JsonUtils.objToJson(aPIMessageVo);
    }
}

2.2业务逻辑层

业务逻辑层,简单举例说明,不同业务有所不同。

    public APIMessageVo router(HttpServletRequest request, String zrsc_param_json) {
        String access_token = request.getParameter("access_token");
        String app_key = request.getParameter("app_key");
        String method = request.getParameter("method");
        String sign = request.getParameter("sign");
        APIMessageVo checkResult=this.routerParaCheck(request, zrsc_param_json,access_token,app_key,method,sign);
        if(!checkResult.isSuccess()){//入参检测失败
            return checkResult;
        }
        if (APPInterfaceNameEnum.API_ADDRESS_ADDRESS2PROVICECITY_GET.getName().equals(method)) {//获取省市区街道
            return this.address2provincecity(zrsc_param_json);
        } else {//接口不存在
            return APIMessageVo.fail(APIErrorEnum.FAIL_NOT_FOUND_INTERFACE.getCode(), APIErrorEnum.FAIL_NOT_FOUND_INTERFACE.getName());
        }
    }
    private APIMessageVo routerParaCheck(HttpServletRequest request, String zrsc_param_json, String access_token,
                                         String app_key, String method, String sign){
        //***************参数校验***************
        if (StringUtils.isBlank(access_token) || StringUtils.isBlank(app_key) || StringUtils.isBlank(method) ||
                StringUtils.isBlank(sign)) {
            return APIMessageVo.fail(APIErrorEnum.FAIL_PARA_LOSE.getCode(), APIErrorEnum.FAIL_PARA_LOSE.getName());
        }
        if(!APP_KEY.equals(app_key)){
            return APIMessageVo.fail(APIErrorEnum.FAIL_NOT_EXIST_APP_ID.getCode(), APIErrorEnum.FAIL_NOT_EXIST_APP_ID.getName());
        }
        //***************sign校验***************
        try {
            //获取request中的参数
            Map<String, String> sysParams = getSysParams(request, zrsc_param_json);
            //SDK参数加密
            String signNew = SDKSignUtils.sign(sysParams, APP_SECRET);
            //判断参数是否被更改
            if (!sign.equals(signNew)) {
                return APIMessageVo.fail(APIErrorEnum.FAIL_ERR_APP_SECRET.getCode(), APIErrorEnum.FAIL_ERR_APP_SECRET.getName());
            }
        } catch (Exception e) {
            return APIMessageVo.fail(APIErrorEnum.FAIL_EXCEPTION.getCode(), APIErrorEnum.FAIL_EXCEPTION.getName());
        }
        return APIMessageVo.success();
    }

2.3基础工具类

APIErrorEnum
public enum APIErrorEnum {
    FAIL_NOTAUTH(201,"没有授权"),
    FAIL_TOKEN_EXPIRE(202,"Token过期"),
    FAIL_PARA_LOSE(203,"缺少参数"),
    FAIL_NOT_REALAUTH(204,"没有实名认证通过"),
    FAIL_NOT_METHOD(205,"没有权限访问这个接口"),
    FAIL_PARA_ERR(206,"参数的值,不正确"),
    FAIL_NOT_EXIST_ACCOUNT(207,"用户账号不存在"),
    FAIL_NOT_FOUND_APPLY(208,"应用不存在"),
    FAIL_NOT_PASS_APPROVAL_APPLY(209,"应用审批未通过"),
    FAIL_NOT_EXIST_APP_ID(210,"APP_ID不存在"),
    FAIL_NOT_FOUND_INTERFACE(211,"接口不存在"),
    FAIL_ERR_APP_SECRET(212,"appSecret错误"),
    FAIL_CALL_FREQUENTLY(214,"调用太频繁"),
    FAIL_EXCEPTION(290,"未知错误");
    private int code;
    private String name;
    APIErrorEnum(int code,String name) {
        this.code = code;
        this.name = name;
    }
    public int getCode() {
        return code;
    }
    public String getName() {
        return name;
    }
    public void setCode(int code) {
        this.code = code;
    }
    public void setName(String name) {
        this.name = name;
    }
}
APIMessageVo
public class APIMessageVo {
    public static final Integer SUCCESS = 100;//成功
    private boolean success;// 处理是否成功
    private Integer code = SUCCESS;//状态码
    private String message = "成功";// 附加消息, 如处理结果失败时的原因等
    private Object data="";// 可以附带返回一些结果数据
    public APIMessageVo() {
        //default
    }
    public APIMessageVo(boolean success, Integer code) {
        this(success, code, "成功", null);
    }
    public APIMessageVo(boolean success, Integer code, String message) {
        this(success, code, message, null);
    }
    public APIMessageVo(boolean success, String message, Object data) {
        this.success = success;
        this.message = message;
        this.data = data;
    }
    public APIMessageVo(boolean success, Integer code, String message, Object data) {
        this.success = success;
        this.code = code;
        this.message = message;
        this.data = data;
    }
    public APIMessageVo(boolean success, Object data) {
        this.success = success;
        this.data = data;
    }
    public static APIMessageVo fail(Integer code) {
        return new APIMessageVo(false, code);
    }
    public static APIMessageVo fail(Integer code,String message) {
        return new APIMessageVo(false,code, message);
    }
    public static APIMessageVo fail(Integer code,String message, Object data) {
        return new APIMessageVo(false,code, message, data);
    }
    public static APIMessageVo success() {
        return new APIMessageVo(true, SUCCESS);
    }
    public static APIMessageVo success(String message) {
        return new APIMessageVo(true, message);
    }
    public static APIMessageVo success(String message, Object data) {
        return new APIMessageVo(true, SUCCESS, message, data);
    }
    public static APIMessageVo success(Object data) {
        return new APIMessageVo(true, "成功", data);
    }
}
JsonUtils
public class JsonUtils {
    // 定义jackson对象
     private static final ObjectMapper MAPPER = new ObjectMapper();
    /**
     * 对象转Json
     *
     * @param obj 对象
     * @return json串
     */
    public static String objToJson(Object obj) {
        try {
            return MAPPER.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            log.error("Json转换异常:{}", e);
        }
        return "Json转换异常";
    }
    /**
     * json转对象
     * @param jsonData json串
     * @param beanType 对象
     * @return 对象
     */
    public static <T> T jsonToPojo(String jsonData, Class<T> beanType) {
        try {
            T obj = MAPPER.readValue(jsonData, beanType);
            return obj;
        } catch (Exception e) {
            log.error("Json转换异常:{}", e);
        }
        return null;
    }
}

3.SDK代码,Java举例

DefaultZrscClient
public class DefaultZrscClient implements ZrscClient {
    private String serverUrl;
    private String accessToken;
    private int connectTimeout;
    private int readTimeout;
    private String appKey;
    private String fuzz;
    private String appSecret;
    public DefaultZrscClient(String serverUrl, String accessToken, String appKey, String appSecret) {
        this.connectTimeout = 8000;
        this.readTimeout = 8000;
        this.serverUrl = serverUrl;
        this.accessToken = accessToken;
        this.appKey = appKey;
        this.appSecret = appSecret;
    }
    public <T extends AbstractResponse> T execute(ZrscRequest<T> request) throws ZrscException {
        try {
            String url = this.buildUrl(request);
            Map<String, String> params = new HashMap();
            String json = request.getAppJsonParams();
            params.put("zrsc_param_json", json);
            if (request.getOtherParams() != null) {
                params.put("other", request.getOtherParams());
            }
            String rsp = HttpUtil.doPost(url, params, this.connectTimeout, this.readTimeout,this.accessToken);
            T resp = this.parse(rsp, request.getResponseClass());
            StringBuffer sb = new StringBuffer();
            sb.append(url).append("&").append("zrsc_param_json").append("=").append(json);
            resp.setUrl(sb.toString());
            return resp;
        } catch (Exception var8) {
            var8.printStackTrace();
            throw new ZrscException("出现异常,请重试");
        }
    }
    private <T extends AbstractResponse> String buildUrl(ZrscRequest<T> request) throws Exception {
        Map<String, String> sysParams = request.getSysParams();
        Map<String, String> pmap = new TreeMap();
        pmap.put("zrsc_param_json", request.getAppJsonParams());
        sysParams.put("method", request.getApiMethod());
        sysParams.put("access_token", this.accessToken);
        sysParams.put("app_key", this.appKey);
        pmap.putAll(sysParams);
        String sign = this.sign(pmap, this.appSecret);
        sysParams.put("sign", sign);
        StringBuilder sb = new StringBuilder(this.serverUrl);
        sb.append("?");
        sb.append(HttpUtil.buildQuery(sysParams, "UTF-8"));
        return sb.toString();
    }
    private <T extends AbstractResponse> T parse(String rsp, Class<T> responseClass) throws ZrscException {
        Parser parser;
        if (this.serverUrl.endsWith("json")) {
            parser = ParserFactory.getJsonParser();
        } else {
            parser = ParserFactory.getXmlParser();
        }
        return parser.parse(rsp, responseClass);
    }
    private String sign(Map<String, String> pmap, String appSecret) throws Exception {
        StringBuilder sb = new StringBuilder(appSecret);
        Iterator i$ = pmap.entrySet().iterator();
        while(i$.hasNext()) {
            Map.Entry<String, String> entry = (Map.Entry)i$.next();
            String name = (String)entry.getKey();
            String value = (String)entry.getValue();
            if (StringUtil.areNotEmpty(new String[]{name, value})) {
                sb.append(name).append(value);
            }
        }
        sb.append(appSecret);
        String result = CodecUtil.md5(sb.toString());
        return result;
    }
}
HttpUtil
public class HttpUtil {
    public static final String DEFAULT_CHARSET = "UTF-8";
    private static final String METHOD_POST = "POST";
    private HttpUtil() {
        throw new UnsupportedOperationException();
    }
    public static String buildQuery(Map<String, String> params, String charset) throws Exception {
        if (params != null && !params.isEmpty()) {
            StringBuilder query = new StringBuilder();
            Set<Entry<String, String>> entries = params.entrySet();
            boolean hasParam = false;
            Iterator i$ = entries.iterator();
            while(i$.hasNext()) {
                Entry<String, String> entry = (Entry)i$.next();
                String name = (String)entry.getKey();
                String value = (String)entry.getValue();
                if (StringUtil.areNotEmpty(new String[]{name, value})) {
                    if (hasParam) {
                        query.append("&");
                    } else {
                        hasParam = true;
                    }
                    query.append(name).append("=").append(URLEncoder.encode(value, charset));
                }
            }
            return query.toString();
        } else {
            return null;
        }
    }
    public static String doPost(String url, Map<String, String> params, int connectTimeout, int readTimeout,String token) throws Exception {
        return doPost(url, params, "UTF-8", connectTimeout, readTimeout,token);
    }
    public static String doPost(String url, Map<String, String> params, String charset, int connectTimeout, int readTimeout,String token) throws Exception {
        String ctype = "application/x-www-form-urlencoded;charset=" + charset;
        //String ctype = "application/json;charset=" + charset;
        String query = buildQuery(params, charset);
        byte[] content = new byte[0];
        if (query != null) {
            content = query.getBytes(charset);
        }
        return doPost(url, ctype, content, connectTimeout, readTimeout,token);
    }

    public static String doPost(String url, String ctype, byte[] content, int connectTimeout, int readTimeout,String token) throws IOException {
        HttpURLConnection conn = null;
        OutputStream out = null;
        String rsp = null;
        try {
            conn = getConnection(new URL(url), "POST", ctype,token);
            conn.setConnectTimeout(connectTimeout);
            conn.setReadTimeout(readTimeout);
            out = conn.getOutputStream();
            out.write(content);
            rsp = getResponseAsString(conn);
        } finally {
            if (out != null) {
                out.close();
            }
            if (conn != null) {
                conn.disconnect();
            }
        }
        return rsp;
    }
    private static HttpURLConnection getConnection(URL url, String method, String ctype,String token) throws IOException {
        HttpURLConnection conn = null;
        if ("https".equals(url.getProtocol())) {
            SSLContext ctx = null;
            try {
                ctx = SSLContext.getInstance("TLS");
                ctx.init(new KeyManager[0], new DefaultTrustManager[]{new DefaultTrustManager()}, new SecureRandom());
            } catch (Exception var6) {
                throw new IOException(var6);
            }
            HttpsURLConnection connHttps = (HttpsURLConnection)url.openConnection();
            connHttps.setSSLSocketFactory(ctx.getSocketFactory());
            connHttps.setHostnameVerifier(new HostnameVerifier() {
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            });
            conn = connHttps;
        } else {
            conn = (HttpURLConnection)url.openConnection();
        }
        ((HttpURLConnection)conn).setRequestMethod(method);
        ((HttpURLConnection)conn).setDoInput(true);
        ((HttpURLConnection)conn).setDoOutput(true);
        ((HttpURLConnection)conn).setRequestProperty("Accept", "text/xml,text/javascript,text/html");
        ((HttpURLConnection)conn).setRequestProperty("User-Agent", "kcb-sdk-java");
        ((HttpURLConnection)conn).setRequestProperty("Content-Type", ctype);
        ((HttpURLConnection)conn).setRequestProperty("Authorization", token);
        return (HttpURLConnection)conn;
    }
    protected static String getResponseAsString(HttpURLConnection conn) throws IOException {
        String charset = getResponseCharset(conn.getContentType());
        InputStream es = conn.getErrorStream();
        if (es == null) {
            return getStreamAsString(conn.getInputStream(), charset);
        } else {
            String msg = getStreamAsString(es, charset);
            if (StringUtil.isEmpty(msg)) {
                throw new IOException(conn.getResponseCode() + ":" + conn.getResponseMessage());
            } else {
                throw new IOException(msg);
            }
        }
    }
    private static String getStreamAsString(InputStream stream, String charset) throws IOException {
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(stream, charset));
            StringWriter writer = new StringWriter();
            char[] chars = new char[256];
            boolean var5 = false;
            int count;
            while((count = reader.read(chars)) > 0) {
                writer.write(chars, 0, count);
            }
            String var6 = writer.toString();
            return var6;
        } finally {
            if (stream != null) {
                stream.close();
            }
        }
    }
    private static String getResponseCharset(String ctype) {
        String charset = "UTF-8";
        if (!StringUtil.isEmpty(ctype)) {
            String[] params = ctype.split(";");
            String[] arr$ = params;
            int len$ = params.length;
            for(int i$ = 0; i$ < len$; ++i$) {
                String param = arr$[i$];
                param = param.trim();
                if (param.startsWith("charset")) {
                    String[] pair = param.split("=", 2);
                    if (pair.length == 2 && !StringUtil.isEmpty(pair[1])) {
                        charset = pair[1].trim();
                    }
                    break;
                }
            }
        }
        return charset;
    }
    private static byte[] getTextEntry(String fieldName, String fieldValue, String charset) throws IOException {
        StringBuilder entry = new StringBuilder();
        entry.append("Content-Disposition:form-data;name=\"");
        entry.append(fieldName);
        entry.append("\"\r\nContent-Type:text/plain\r\n\r\n");
        entry.append(fieldValue);
        return entry.toString().getBytes(charset);
    }
    private static byte[] getFileEntry(String fieldName, String fileName, String mimeType, String charset) throws IOException {
        StringBuilder entry = new StringBuilder();
        entry.append("Content-Disposition:form-data;name=\"");
        entry.append(fieldName);
        entry.append("\";filename=\"");
        entry.append(fileName);
        entry.append("\"\r\nContent-Type:");
        entry.append(mimeType);
        entry.append("\r\n\r\n");
        return entry.toString().getBytes(charset);
    }
}

4.集成SDK,代码举例

    @Test
    void getAddress() throws IOException {
        Address2provicecityRequest request=new Address2provicecityRequest();
        request.setAddress("阿胶街东首路北");
        ZrscClient client = new DefaultZrscClient(serverUrl, accessToken, appKey,
                appSecret);
        try {
            Address2provicecityResponse response= client.execute(request);
            System.out.println("data="+JsonUtil.toJson(response.getData()));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

运行结果:

data={"source":"阿胶街东首路北","province":"山东省","city":"聊城市","area":"东阿县","street":"新城街道","addressInfo":"阿胶街东首路北"}

5.总结

京东开放平台中的传参和签名算法比较有代表性,此博客,只是分享开放平台开放的主要组成部分,希望大家可以多多关注我们的其他内容!

(0)

相关推荐

  • python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析

    一.环境准备 python3.8.3 pycharm 项目所需第三方包 pip install scrapy fake-useragent requests selenium virtualenv -i https://pypi.douban.com/simple 1.1 创建虚拟环境 切换到指定目录创建 virtualenv .venv 创建完记得激活虚拟环境 1.2 创建项目 scrapy startproject 项目名称 1.3 使用pycharm打开项目,将创建的虚拟环境配置到项目中来

  • 利用JavaScript模拟京东按键输入功能

    在看到这个功能的时候我也很惊讶,京东竟然做了这样的一个功能.在京东商城网页版,无论你在什么位置,只需要按下S键,就可以将光标定位到搜索栏进行搜索.虽然说这是一个很不错的功能,但是貌似没有几个人知道. 程序实现很简单,在s键上升的时候搜索框获得焦点就可以了. <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name=&q

  • JS实现京东商品分类侧边栏

    本文实例为大家分享了JS实现京东商品分类侧边栏的具体代码,供大家参考,具体内容如下 HTML代码部分 <div> <img src="/1.png" alt=""> </div> <ul> <li><a href="">京东秒杀</a></li> <li class="two"><a href="&quo

  • Android实现京东首页效果

    本文实例为大家分享了Android实现京东首页效果的具体代码,供大家参考,具体内容如下 1.效果图: 2.布局 源码链接 <?xml version="1.0" encoding="utf-8"?> <com.scwang.smart.refresh.layout.SmartRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns

  • 仿京东平台框架开发开放平台(包含需求,服务端代码,SDK代码)

    目录 1开放平台需求 1.1调用参数 1.2签名算法 2服务端代码,Java举例 2.1接口入口代码 2.2业务逻辑层 2.3基础工具类 3.SDK代码,Java举例 4.集成SDK,代码举例 5.总结 1开放平台需求 用户需要按照开放平台的协议规范拼装一个正确的URL,通过Https请求到开放平台既能够获取到所需数据.主要流程包含:填写参数.生成签名.拼装HTTPS请求.发起请求.得到响应结果.解析结果. 1.1调用参数 参数名称 参数类型 是否必传 参数描述 method String 是

  • Android—基于微信开放平台v3SDK开发(微信支付填坑)

    接触微信支付之前听说过这是一个坑,,,心里已经有了准备...我以为我没准跳坑出不来了,没有想到我填上了,调用成功之后我感觉公司所有的同事都是漂亮的,隔着北京的大雾霾我仿佛看见了太阳~~~好了,装逼结束...进入正题 开发准备: 1.在微信开放平台申请账号 2.成功后创建应用,就是填一些看似很官方很正经的资料了...(说审核7天左右,没有意外的情况下你的app第二天就审核成功了是不是很开心,有了appid,是不是就可以调用微   信支付了????-------想多了,真的) 3.微信支付是需要额外

  • Yii Framework框架开发微信公众平台示例

    本文实例讲述了Yii Framework框架开发微信公众平台.分享给大家供大家参考,具体如下: 1. 先到微信公众平台注册帐号 http://mp.weixin.qq.com 2. 下载demo 微信公众平台提供了一个十分"朴素"的demo,说明如何调用消息接口的.代码真的很朴素,具体内容可到官网下载. 3. 按照Yii的规则,做一个extension. 这里命名为 weixin,目录结构如下: ▾ extensions/       ▾ weixin/           Weixi

  • php天翼开放平台短信发送接口实现方法

    本文实例讲述了php天翼开放平台短信发送接口实现方法.分享给大家供大家参考.具体分析如下: 临时性需求,研究了一下天翼开发平台的东西,用来发送验证码还是不错的,但是每日限额不多,所以很鸡肋,但是保证100%到达 买的话还是蛮贵的,代码没有做任何优化处理,只是测试是否可以实现接口,用的同学记得完善代码,刚写完老大又说是鸡肋的东西,不用了,代码放在博客记录下,代码如下: 复制代码 代码如下: <?php // date_default_timezone_set('PRC'); //获取access_

  • 微信开放平台之网站授权微信登录功能

    1 微信开放平台:https://open.weixin.qq.com/ 2 微信官方教程:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN 3.pc页面显示 4. 通过官方提供的文档,我们可以看出一共分4个步骤 第一步:请求CODE 第二步:通过code获取a

  • 微信公众平台接口开发入门示例

    本文实例讲述了微信公众平台接口开发入门示例.分享给大家供大家参考.具体如下: 微信公众平台的接口开发是一个现在比较常用的功能了,很多的人都会去了解一下微信公众平台一些简单开发应用,这里就来给大家介绍一个入门示例. 这段时间都在忙于微信公众号平台来发,现在已经接近尾声了,所以对于微信开发平台的接口如何使用,在这里也唠刀一两句. 微信平台的开发并不像你想像的那么难,无非就是数据的存取处理罢了,对于数据的存取,简单如留言板,存数据,我们通过表单向数据库提交数据以存入;取数据,通过查询语句从数据库取得,

  • PHP封装的微信公众平台接口开发操作类完整示例

    本文实例讲述了PHP封装的微信公众平台接口开发操作类.分享给大家供大家参考,具体如下: 示例调用 index.php <?php /** * Author: 惹妹子生气了 * Date: 2017-08-10 */ class MpWeixin { public $config; public $class_obj; public $is_check_signature = false; public function __construct() { //获取配置 $this->config

  • 微信公众平台支付开发详解

    公众号支付就是在微信里面的H5页面唤起微信支付,不用扫码即可付款的功能.做这个功能首先要明确的就是,只有和商户号mch_id匹配的appid才能成功支付.商户号在注册成功的时候就会将相关信息发送到邮箱里面.而唤起支付的一个关键是靠openid拿到统一下单.而openid是和appid一一对应的.也就是说如果你登录使用的appid不是公众号的appid,得到的openid就无法唤起公众号内的支付(会出现appid和商户号不匹配的错误).曾经就在这个地方绕了个弯,因为微信的开放平台可以创建网站应用,

  • php版微信公众平台接口开发之智能回复开发教程

    本文实例讲述了php版微信公众平台接口开发之智能回复功能实现方法.分享给大家供大家参考,具体如下: 智能回复是根据用户输入的条件来反馈结果用用户了,这个小编以前有做过信整理了一些例子供各位参考,比较完整主要是介绍在开发端了. 微信自推出后,着实火了一把,而支付功能的推出,又把微信推到了一个无可比拟的高度,然后申请微信订阅号或者服务号的人也开始比肩接踵.下面我将给大家简单讲解下微信公众平台开发接口. 先去 微信公众平台 申请账号,然后按照提示一步步.在选择订阅号和服务号上,个人只能申请订阅号,而且

  • Android开发实现仿京东商品搜索选项卡弹窗功能

    本文实例讲述了Android开发实现仿京东商品搜索选项卡弹窗功能.分享给大家供大家参考,具体如下: 一.效果图: 二.思路: (1)首先顶部布局由通过LinearLayout水平按比重平均分配各个item宽度. (2)每个item设置两种状态,点击状态与未点击状态 (3)弹窗由PopupWindow实现 三.布局 (1)item布局 <!-- 优先筛选条件布局 --> <RelativeLayout android:id="@+id/rl_priority_filter&quo

随机推荐