微信开发接入https协议_delphi实现微信开发接入微信公众号平台 - CSDN
  • 微信开发者文档中指出,第三方在访问微信接口时大多数采用的是https的访问模式,其中有这三种特点: 1.https请求 2.get或post请求方式 3.支持有参数和没有参数提交 百度百科中指出HTTPS(全称:Hyper Text ...

    微信开发者文档中指出,第三方在访问微信接口时大多数采用的是https的访问模式,其中有这三种特点:
    1.https请求
    2.get或post请求方式
    3.支持有参数和没有参数提交
    百度百科中指出HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由网景公司(Netscape)进行,并内置于其浏览器Netscape Navigator中,提供了身份验证与加密通讯方法。现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。

     JSSE简介

      Java安全套接扩展 (Java Secure Socket Extension, JSSE)是实现Internet安全通信的一系列包的集合。它是一个SSL和TLS的纯Java实现,可以透明地提供数据加密、服务器认证、信息完整性 等功能,可以使我们像使用普通的套接字一样使用JSSE建立的安全套接字。JSSE是一个开放的标准,不只是Sun公司才能实现一个JSSE,事实上其他 公司有自己实现的JSSE。

      在深入了解JSSE之前,需要了解一个有关Java安全的概念:客户端的TrustStore文件。客户端的TrustStore文件中保存着被客户端所信任的服务器的证书信息。客户端在进行SSL连接时,JSSE将根据这个文件中的证书决定是否信任服务器端的证书。

      JSSE中,有一个信任管理器类负责决定是否信任远端的证书,这个类有如下的处理规则:

      ⑴ 果系统属性javax.net.sll.trustStore指定了TrustStore文件,那么信任管理器就去jre安装路径下的lib/security/目录中寻找并使用这个文件来检查证书。

      ⑵ 果该系统属性没有指定TrustStore文件,它就会去jre安装路径下寻找默认的TrustStore文件,这个文件的相对路径为:lib/security/jssecacerts。

      ⑶ 如果 jssecacerts不存在,但是cacerts存在(它随J2SDK一起发行,含有数量有限的可信任的基本证书),那么这个默认的TrustStore文件就是cacerts。

      直接使用类HttpsURLConnection访问Web页面

      Java提供了一种非常简洁的方法来访问HTTPS网页,即使用类HttpsURLConnection、URL等。这几个类为支持HTTPS对JSSE相关类做了进一步的封装,例子如下所示:
     

    URL reqURL = new URL("https://www.sun.com" ); //创建URL对象
    HttpsURLConnection httpsConn = (HttpsURLConnection)reqURL.openConnection();
    
    /*下面这段代码实现向Web页面发送数据,实现与网页的交互访问
    httpsConn.setDoOutput(true);
    OutputStreamWriter out = new OutputStreamWriter(huc.getOutputStream(), "8859_1");
    out.write( "……" );
    out.flush();
    out.close();
    */
    
    //取得该连接的输入流,以读取响应内容
    InputStreamReader insr = new InputStreamReader(httpsConn.getInputStream();
    
    //读取服务器的响应内容并显示
    int respInt = insr.read();
    while( respInt != -1){
     System.out.print((char)respInt);
     respInt = insr.read();
    }

    所以想要使用https请求访问微信的接口,有两种可以实现的方式:

    1.将证书导入到TrustStore文件中
    Java提供了命令行工具keytool用于创建证书或者把证书从其它文件中导入到Java自己的TrustStore文件中。把证书从其它文件导入到TrustStore文件中的命令行格式为:

    keytool -import -file src_cer_file –keystore dest_cer_store

    其中,src_cer_file为存有证书信息的源文件名,dest_cer_store为目标TrustStore文件。
    在使用keytool之前,首先要取得源证书文件,这个源文件可使用IE浏览器获得,IE浏览器会把访问过的HTTPS站点的证书保存到本地。从IE 浏览器导出证书的方法是打开“Internet 选项”,选择“内容”选项卡,点击“证书…”按钮,在打开的证书对话框中,选中一个证书,然后点击“导出…”按钮,按提示一步步将该证书保存到一文件中。 最后就可利用keytool把该证书导入到Java的TrustStore文件中。为了能使Java程序找到该文件,应该把这个文件复制到jre安装路径 下的lib/security/目录中。

    这样,只需在程序中设置系统属性javax.net.sll.trustStore指向文件dest_cer_store,就能使JSSE信任该证书,从而使程序可以访问使用未经验证的证书的HTTPS站点。
    使用这种方法,编程非常简单,但需要手工导出服务器的证书。当服务器证书经常变化时,就需要经常进行手工导出证书的操作。下面介绍的实现X509证书信任管理器类的方法将避免手工导出证书的问题。

    2.X509证书信任管理器类的实现及应用
    在JSSE中,证书信任管理器类就是实现了接口X509TrustManager的类。我们可以自己实现该接口,让它信任我们指定的证书。
      接口X509TrustManager有下述三个公有的方法需要我们实现:

      ⑴ void checkClientTrusted(X509Certificate[] chain, String authType) 
    throws CertificateException
    

      该方法检查客户端的证书,若不信任该证书则抛出异常。由于我们不需要对客户端进行认证,因此我们只需要执行默认的信任管理器的这个方法。JSSE中,默认的信任管理器类为TrustManager。

      ⑵ void checkServerTrusted(X509Certificate[] chain, String authType) 
    throws CertificateException 
    

      该方法检查服务器的证书,若不信任该证书同样抛出异常。通过自己实现该方法,可以使之信任我们指定的任何证书。在实现该方法时,也可以简单的不做任何处理,即一个空的函数体,由于不会抛出异常,它就会信任任何证书。

      ⑶ X509Certificate[] getAcceptedIssuers() 
    

      返回受信任的X509证书数组。
    java完整代码:

    /*
     *证书信任管理器(用于实现https) 
     */
    public class MyX509TrustManager implements X509TrustManager{
    
        @Override
        public void checkClientTrusted(X509Certificate[] arg0, String arg1)
                throws CertificateException {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void checkServerTrusted(X509Certificate[] arg0, String arg1)
                throws CertificateException {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public X509Certificate[] getAcceptedIssuers() {
            // TODO Auto-generated method stub
            return null;
        }
    
    }

      自己实现了信任管理器类,如何使用呢?类HttpsURLConnection似乎并没有提供方法设置信任管理器。其 实,HttpsURLConnection通过SSLSocket来建立与HTTPS的安全连接,SSLSocket对象是由 SSLSocketFactory生成的。HttpsURLConnection提供了方法 setSSLSocketFactory(SSLSocketFactory)设置它使用的SSLSocketFactory对象。 SSLSocketFactory通过SSLContext对象来获得,在初始化SSLContext对象时,可指定信任管理器对象。下面用一个图简单表 示这几个JSSE类的关系:这里写图片描述

    图1 部分JSSE类的关系图
      假设自己实现的X509TrustManager类的类名为:MyX509TrustManager,下面的代码片断说明了如何使用MyX509TrustManager:

    public class HttpsUtil {
    
        public static void https(String requestUrl,String requestMethod,String submitData)
        {
            try {
                //设置https访问模式,采用SSL加密
                TrustManager[] tm={new MyX509TrustManager()};
                // 创建SSLContext对象,并使用我们指定的信任管理器初始化
                SSLContext sslContext=SSLContext.getInstance("SSL","SunJSSE");
                sslContext.init(null, tm, new java.security.SecureRandom());
                //从sslContext获取SSLSocketFactory
                SSLSocketFactory ssf=sslContext.getSocketFactory();
                URL url=new URL(requestUrl);
                HttpsURLConnection httpsURLCon=(HttpsURLConnection) url.openConnection();
                httpsURLCon.setSSLSocketFactory(ssf);
                httpsURLCon.setDoInput(true);
                httpsURLCon.setDoOutput(true);
                httpsURLCon.setUseCaches(false);
                httpsURLCon.setRequestMethod(requestMethod);//设置请求方式get;post
                if ("GET".equalsIgnoreCase(requestMethod)) {
                    httpsURLCon.connect();
                }
                //当需要有数据提交给微信接口时
                if (null!=submitData) {
                    OutputStream outputStream=httpsURLCon.getOutputStream();
                    outputStream.write(submitData.getBytes("UTF-8"));
                    outputStream.close();
                }
        }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }
    }

    于此,我们就封装了一个https请求的方法,接下来我们可以通过这个方法来调用https访问微信的接口来实现诸如修改菜单,上传图片等等功能。

    展开全文
  • 微信开发https请求

    2015-01-24 21:27:33
    * httpRequest:(发起https请求并获取结果). *  * @author hankeqi * @param @param requestUrl 请求地址 * @param @param requestMethod 请求方式(GET、POST) * @param @param outputStr 提交的...
     /**
    * 
    
    * httpRequest:(发起https请求并获取结果).
    
    * 
    
    * @author hankeqi
    
    * @param @param requestUrl 请求地址
    
    * @param @param requestMethod 请求方式(GET、POST)
    
    * @param @param outputStr 提交的数据
    
    * @param @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
    
    * @throws JSONObject DOM对象
    
    * @since JDK 1.7
    
    */
    
    public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {
    
    JSONObject jsonObject = null;
    
    StringBuffer buffer = new StringBuffer();
    
    try {
    
    TrustManager[] tm = { (TrustManager) new MyX509TrustManager() };// 创建SSLContext对象,并使用我们指定的信任管理器初始化
    
    SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
    
    sslContext.init(null, tm, new java.security.SecureRandom());
    
    SSLSocketFactory ssf = sslContext.getSocketFactory();// 从上述SSLContext对象中得到SSLSocketFactory对象
    
    URL url = new URL(requestUrl);
    
    HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();
    
    httpUrlConn.setSSLSocketFactory(ssf);
    
    httpUrlConn.setDoOutput(true);
    
    httpUrlConn.setDoInput(true);
    
    httpUrlConn.setUseCaches(false);
    
    httpUrlConn.setRequestMethod(requestMethod);// 设置请求方式(GET/POST)
    
    if ("GET".equalsIgnoreCase(requestMethod))
    
    httpUrlConn.connect();
    
    if (null != outputStr) {// 当有数据需要提交时
    
    OutputStream outputStream = httpUrlConn.getOutputStream();
    
    outputStream.write(outputStr.getBytes("UTF-8"));// 注意编码格式,防止中文乱码
    
    outputStream.close();
    
    }
    
    InputStream inputStream = httpUrlConn.getInputStream();// 将返回的输入流转换成字符串
    
    InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
    
    BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
    
    String str = null;
    
    while ((str = bufferedReader.readLine()) != null) {
    
    buffer.append(str);
    
    }
    
    bufferedReader.close();
    
    inputStreamReader.close();
    
    inputStream.close();// 释放资源
    
    inputStream = null;
    
    httpUrlConn.disconnect();
    
    jsonObject = JSONObject.fromObject(buffer.toString());
    
    } catch (ConnectException ce) {
    
    log.error("Weixin server connection timed out.");
    
    } catch (Exception e) {
    
    log.error("https request error:", e);
    
    }
    
    return jsonObject;
    
    }
    
    


    展开全文
  • 微信开发接口API协议

    2019-05-22 15:13:55
    微信开发接口API协议,出自冬天不穿秋裤,天冷也要风度的程序猿之手,必属精品! 一、网络通讯协议 如上图,采用 datalength+databytes 的自定义长度的协议,其中: datalength:紧跟其后的databytes的数据长度...

    微信开发接口API协议,出自冬天不穿秋裤,天冷也要风度的程序猿之手,必属精品!

    一、网络通讯协议

    如上图,采用 datalength+databytes 的自定义长度的协议,其中:

    datalength:紧跟其后的databytes的数据长度(不包含自身长度),占4字节

    databytes:protobuf 3.0协议数据序列化后的数据内容,长度不限

    二、网络应答模型

    1、业务消息

    服务端客户端间的消息大致分为以下四类:

    1)通知类消息

    通常由客户端发往服务器端,或者由服务器端发往客服客户端,接收方一般需要作出接收确认回复或不回复(默认成功异常时回复)。

    2)客户端同步请求类消息

    通常由手机客户端或客服客户端发出,服务端需要回复对应的响应消息。

    3)服务器端指令类消息

    通常是由服务器或者客服客户端发出的操作手机客户端的指令类消息,手机客户端收到后一般需要回复接收成功确认消息,并在后续执行完指令后回复发送结果通知消息。

    客户端在与服务器建立连接后,需要先发送DeviceAuthReq请求获取accesstoken后才能正常进行后续通信,建立连接时的通信时序图如下:

    2、心跳机制

    已于服务器建立连接的客户端需要每隔1分钟发送一个心跳包,时序图如下:

    三、Protobuf消息定义

    所有业务消息都转化为protobuf消息进行序列化后传输,不同命令对应的消息使用protobuf的Any类型嵌套入根消息,接收方在收到根消息后根据命令码反序列化为相应类型消息。

    消息结构定义基本约定:

    1)使用proto3语法

    2)package 命名空间统一采用 Jubo.JuLiao.IM.Wx.Proto

    3)消息命名采用 Pascal命名法,例如 FirstName,LastName

    4)时间字段统一用Unix-Timestamp形式

    5)message类型名全部为对应MsgType+Message后缀,如MsgType=DeviceAuthReq的消息的消息结构名定义为 message DeviceAuthReqMessage{}

    根消息(TransportMessage)

    根消息代表最终直接序列化为网络字节流的消息,其中应包含基本的发送方信息(用于授权认证)和其包含的具体的业务命令消息及命令码标识。

    所有的其他类型的消息都应该赋值到根消息的Content字段,并将MsgType字段设为对应值,之后将TransportMessage数据序列化做网络传输。接收方在收到消息后根据MsgType将Content内容反序列化成对应的强类型消息。

    sdk功能模块请参考:http://www.yunlauncher.com/Blog/articles/119.html

    1、基础消息类型

    1、客户端发送的心跳包

    HeartBeatReq = 1001;

    2、消息接收确认回复(接收或拒绝接收)

    MsgReceivedAck = 1002;

    3、错误单独提升为一种消息类型

    Error = 1003;

    2、设备客户端授权类消息

    1、设备(手机客户端、客服客户端)获取通信token请求

    DeviceAuthReq = 1010;

    2、设备(手机客户端、客服客户端)获取通信token响应

    DeviceAuthRsp = 1011;

    3、设备授权后退出(仅用于服务端内部)

    DeviceExitNotice = 1012;

    4、账号强制下线通知

    AccountForceOfflineNotice = 1013;

    3、手机客户端上传的通知类消息

    1、手机客户端微信上线通知

    WeChatOnlineNotice = 1020;

    2、手机客户端微信下线通知

    WeChatOfflineNotice = 1021;

    3、微信个人号新增好友通知

    FriendAddNotice = 1022;

    4、微信个人号移除好友通知

    FriendDelNotice = 1023;

    5、微信好友发来聊天消息

    FriendTalkNotice = 1024;

    6、任务执行结果通知

    TaskResultNotice = 1025;

    7、手机上回复好友的聊天消息

    WeChatTalkToFriendNotice = 1026;

    8、有好友请求添加好友的通知

    FriendAddReqeustNotice = 1027;

    9、手机端向服务端通知聊天执行结果

    TalkToFriendTaskResultNotice = 1028;

    10、图片或视频消息的详细内容结果

    RequestTalkDetailTaskResultNotice = 1029;

    11、上传手机客户端上微信的二维码

    PullWeChatQrCodeTaskResultNotice = 1030;

    12、手机上发送了朋友圈通知

    CircleNewPublishNotice = 1031;

    13、手机上删除朋友圈通知

    CircleDelNotice = 1032;

    14、手机检测到有人点赞/取消点赞通知

    CircleLikeNotice = 1033;

    15、手机检测到有人评论/删除朋友圈通知

    CircleCommentNotice = 1034;

    16、消息标记为已读

    PostMessageReadNotice = 1035;

    17、联系人信息上传

    ContactsInfoNotice = 1036;

    18、群聊新增通知

    ChatRoomAddNotice = 1037;

    19、联系人标签新增,修改通知

    ContactLabelAddNotice = 1038;

    20、收钱任务执行结果通知

    TakeMoneyTaskResultNotice = 1039;

    21、朋友圈图片上传

    CircleDetailNotice = 1040;

    22、群聊删除通知

    ChatRoomDelNotice = 1041;

    23、群聊信息变更通知

    ChatRoomChangedNotice = 1042;

    24、群二维码

    PullChatRoomQrCodeTaskResultNotice = 1043;

    4、服务端、客服客户端发给设备的指令类消息

    1、给好友发消息任务

    TalkToFriendTask = 1070;

    2、发送朋友圈任务

    PostSNSNewsTask = 1071;

    3、主动添加好友任务

    AddFriendsTask = 1072;

    4、发送朋友圈任务后数据回传

    PostSNSNewsTaskResultNotice = 1073;

    5、删除朋友圈

    DeleteSNSNewsTask = 1074;

    6、客户端或者服务端接受好友请求通知

    AcceptFriendAddRequestTask = 1075;

    7、群发消息任务

    WeChatGroupSendTask = 1076;

    8、执行养号动作命令

    WeChatMaintenanceTask = 1077;

    9、请求图片或视频消息的详细内容

    RequestTalkDetailTask = 1078;

    10、服务端主动要求手机上传当前登录的微信二维码

    PullWeChatQrCodeTask = 1079;

    11、触发手机推送好友列表任务

    TriggerFriendPushTask = 1080;

    12、触发手机推送朋友圈列表任务

    TriggerCirclePushTask = 1081;

    13、朋友圈评论删除任务

    CircleCommentDeleteTask = 1082;

    14、朋友圈评论删除任务反馈

    CircleCommentDeleteTaskResultNotice = 1083;

    15、朋友圈评论回复任务

    CircleCommentReplyTask = 1084;

    16、朋友圈评论回复反馈

    CircleCommentReplyTaskResultNotice = 1085;

    17、通知手机将某个聊天窗口置为已读

    TriggerMessageReadTask = 1086;

    18、消息撤回

    RevokeMessageTask = 1087;

    19、转发消息

    ForwardMessageTask = 1088;

    20、通知手机推送聊天记录

    TriggerHistoryMsgPushTask = 1089;

    21、获取群聊二维码

    PullChatRoomQrCodeTask = 1090;

    5、服务端通知执行的命令

    1、服务端通知pc客户版本升级

    UpgradeAppNotice = 1093;

    2、通知手机客户端软件升级

    UpgradeDeviceAppNotice = 1094;

    3、清粉任务

    PostFriendDetectTask = 1095;

    4、终止清粉任务

    PostStopFriendDetectTask = 1096;

    5、删除设备通知

    PostDeleteDeviceNotice = 1097;

    6、朋友圈点赞任务

    PostMomentsPraiseTask = 1098;

    7、停止朋友圈点赞任务

    PostStopMomentsPraiseTask = 1099;

    8、养号任务停止

    PostStopWeChatMaintenanceTask = 1100;

    9、修改备注任务

    ModifyFriendMemoTask = 1101;

    10、领取红包或转账

    TakeLuckyMoneyTask = 1200;

    11、获取指定好友朋友圈

    PullFriendCircleTask = 1201;

    12、获取朋友圈图片

    PullCircleDetailTask = 1202;

    13、单条朋友圈点赞任务

    CircleLikeTask = 1203;

    14、触发手机推送群聊列表

    TriggerChatroomPushTask = 1210;

    15、请求具体群聊的详细信息

    RequestChatRoomInfoTask = 1211;

    16、获取联系人详细信息(不一定是好友,如群聊成员)

    RequestContactsInfoTask = 1212;

    17、群聊管理

    ChatRoomActionTask = 1213;

    18、群内加好友

    AddFriendInChatRoomTask = 1214;

    19、通讯录加好友

    AddFriendFromPhonebookTask = 1215;

    20、删除好友

    DeleteFriendTask = 1216;

    21、发红包

    SendLuckyMoneyTask = 1217;

    22、获取聊天消息的原始内容(主要是xml内容)

    RequestTalkContentTask = 1218;

    23、返回聊天消息的原始内容

    RequestTalkContentTaskResultNotice = 1219;

    24、转发消息内容

    ForwardMessageByContentTask = 1220;

    6、手机端主动发出的交互类消息

    1、手机端推送好友列表

    FriendPushNotice = 2026;

    2、手机端推送当前安装版本

    PostDeviceInfoNotice = 2027;

    3、手机端回传检测清粉好友数

    PostFriendDetectCountNotice = 2028;

    4、手机回传朋友圈数据

    CirclePushNotice = 2029;

    5、手机回传朋友圈点赞数量

    PostMomentsPraiseCountNotice = 2030;

    9、手机端推送群聊列表

    ChatroomPushNotice = 2031;

    7、手机端推送标签列表

    ContactLabelInfoNotice = 2032;

    8、推送历史消息

    HistoryMsgPushNotice = 2033;

    9、群成员(陌生人)信息

    ChatRoomMembersNotice = 2034;

    sdk适用于微信营销软件研发、微信营销手机研发、微信手机群控云控系统研发、微信SCRM客服系统研发、微信营销工具研发、淘宝客机器人、导购返利机器人研发等,目前【聚客通】【有客来】等scrm都是基于这个sdk二次开发的。

    接口参考http://www.yunlauncher.com/Blog/articles/119.html 项目地址:https://www.wuliaokankan.cn/url301/138.html
    展开全文
  • Android微信支付接入

    2018-06-04 01:00:53
    前言:本文主要说明如何在Android项目中接入微信支付,介绍微信支付在项目中的配置,分析微信支付数据与其交互流程,分享个人遇到的坑,以帮助有需要的朋友能更快的在项目中进行微信支付的接入。 正文: 1,开发...

    前言:本文主要说明如何在Android项目中接入微信支付,介绍微信支付在项目中的配置,分析微信支付数据与其交互流程,分享个人遇到的坑,以帮助有需要的朋友能更快的在项目中进行微信支付的接入。 
    正文: 
    1,开发资质申请: 
    这个过程在本文中不详细介绍,总的来说需要企业资质申请微信支付功能以及微信开发者,最终是为了得到APPID和商户密钥(后面会详讲这个两个值怎么使用) 
    2,流程总体介绍 
    微信支付总体结构图: 
    这里写图片描述 
    订单信息:简单来讲就是对订单的封装,其中包含了支付金额,支付时间,订单号,签名信息等等订单信息。这些信息在项目中一般是由服务端构建的,交付给APP转发给微信服务器即可。但是实际情况中服务端可能也没有做这个工作,那么订单信息也有可能在APP端合成。所以开发时务必和后端开发人员协商好关于订单信息构造的工作。(订单构造详情见下文) 
    支付请求:即APP在程序中调用支付SDK将订单信息发送给微信服务器,这个过程在代码中是很简单的,微信封装好了这个请求接口执行一行代码即可调用(详情见下文) 
    支付结果反馈:微信会在特定回调接口通知支付接口 
    总体上这就是微信支付的结构,操作上稍微复杂的是订单信息的构造,容易导致出错的微信SDK的配置。那么接下来就具体的一一介绍每个点的实现。 
    3,下载官方demo 
    官网SDK以及demo下载地址:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=&lang=zh_CN 
    官方文档地址:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=1_1 
    下载完成后将libammsdk.jar导入到项目中,至于官方demo,建议大家看看就好,不要太相信。因为写的是在太烂了(不知道为什么微信这么大个平台,开发的demo是如此的不考虑用户的感受) 
    4,实现 
    a,导入jar包 
    b,在工程包名下根目录新建wxapi包,这个wxapi包的位置一定要是包名根目录,包名也不能错。(这让对包名有强迫症的开发者会很不爽,但是没办法) 
    这里写图片描述 
    c,在该包下新建回调类WXPayEntryActivity,该类的名字一定是在wxapi包下,名字也一定是WXPayEntryActivity。因为他是微信回调的接口,如果改变位置或名字,就会导致微信无法将支付结果反馈,从而导致支付失败。 
    这里写图片描述 
    (图中WXEntryActivity是用作微信分享或其他功能的,只做微信支付的朋友可以忽略) 
    d,WXPayEntryActivity的代码实现以及使用说明: 
    该类是不需要开发者自己调用的,他是在微信支付后SDK为了回调通知APP的接口,SDK内部会调用该Activity,该Activity的界面布局可以自定义的设置。 
    其具体的回调接口是该类中的onResp函数,在该函数中可判断是否支付成功。

    public class WXPayEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {
    
        private IWXAPI api;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_wxpay_entry);
            api = WXAPIFactory.createWXAPI(this, "wxAPPID");//这里填入自己的微信APPID
            api.handleIntent(getIntent(), this);
        }
    
        @Override
        public void onReq(BaseReq baseReq) {
    
        }
    
        @Override
        public void onResp(BaseResp baseResp) {
            Log.d("coyc", "onPayFinish, errCode = " + baseResp.errCode);
    
            if (baseResp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
                int errCord = baseResp.errCode;
                if (errCord == 0) {
                    App.getInstance().tos("支付成功!");
                } else {
                    App.getInstance().tos("支付失败");
                }
                //这里接收到了返回的状态码可以进行相应的操作,如果不想在这个页面操作可以把状态码存在本地然后finish掉这个页面,这样就回到了你调起支付的那个页面
                //获取到你刚刚存到本地的状态码进行相应的操作就可以了
                finish();
            }
        }
    
        @Override
        protected void onNewIntent(Intent intent) {
            super.onNewIntent(intent);
            setIntent(intent);
            api.handleIntent(intent, this);
        }
    }

    e,AndroidManifest.xml配置:

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    
            <!-- 微信支付 -->
            <activity
                android:name=".wxapi.WXPayEntryActivity"
                android:exported="true"
                android:launchMode="singleTop">
                <intent-filter>
                    <action android:name="android.intent.action.VIEW" />
    
                    <category android:name="android.intent.category.DEFAULT" />
    
                    <data android:scheme="自己的wxAPPID" />
                </intent-filter>
            </activity>
    

    f,调用支付接口:

    IWXAPI api= WXAPIFactory.createWXAPI(context, "wxAPPID",false);//填写自己的APPID
    api.registerApp("wxAPPID");//填写自己的APPID,注册本身APP
    PayReq req = new PayReq();//PayReq就是订单信息对象
    //给req对象赋值
    req.appId = appid;//APPID
    req.partnerId = partnerid;//    商户号
    req.prepayId = prepayid;//  预付款ID
    req.nonceStr = getRoundString();//随机数
    req.timeStamp = getTimeStamp();//时间戳
    req.packageValue = "Sign=WXPay";//固定值Sign=WXPay
    req.sign = sign;//签名
    
    api.sendReq(req);//将订单信息对象发送给微信服务器,即发送支付请求

    那么写到这里,上面的PayReq 对象其实是未被赋值的

            req.appId = appid;//APPID
            req.partnerId = partnerid;//    商户号
            req.prepayId = prepayid;//  预付款ID
            req.nonceStr = getRoundString();//随机数
            req.timeStamp = getTimeStamp();//时间戳
            req.packageValue = "Sign=WXPay";//固定值Sign=WXPay
            req.sign = sign;//签名

    而且这7个参数是缺一不可的,如果这些参数都是在服务端生成的,那么在Android开发人员就不用做什么工作了,将服务端给的值给其赋值就好了,那么整个微信支付流程也就做完了(一般来讲也确实是这个样子)。但是有些情况下服务端的同事没有做这些工作,比如说签名工作等等。那么这么这些工作就要在APP本地实现。 
    下面我给出随机数获取算法,时间戳获取算法,签名算法。

    private String getRoundString() {
    
            Random random = new Random();
    
            return random.nextInt(10000) + "";
        }
    
        private String getTimeStamp() {
            return new Date().getTime() / 10 + "";
        }
        private String getSign() {
            Map<String, String> map = new HashMap<>();
            map.put("appid", req.appId);
            map.put("partnerid", req.partnerId);
            map.put("prepayid", req.prepayId);
            map.put("package", req.packageValue);
            map.put("noncestr", req.nonceStr);
            map.put("timestamp", req.timeStamp);
    
            ArrayList<String> sortList = new ArrayList<>();
            sortList.add("appid");
            sortList.add("partnerid");
            sortList.add("prepayid");
            sortList.add("package");
            sortList.add("noncestr");
            sortList.add("timestamp");
            sort(sortList);
    
            String md5 = "";
            int size = sortList.size();
            for (int k = 0; k < size; k++) {
                if (k == 0) {
                    md5 += sortList.get(k) + "=" + map.get(sortList.get(k));
                } else {
                    md5 += "&" + sortList.get(k) + "=" + map.get(sortList.get(k));
                }
            }
            String stringSignTemp = md5+"&key=商户密钥";//这里填写自己的商户密钥,所以说如果签名工作实在服务端完成的,商户密钥在APP端是用不到的
    
            String sign=MD5.Md5(stringSignTemp).toUpperCase();
    
            return sign;
        }

    //
    // Source code recreated from a .class file by IntelliJ IDEA
    // (powered by Fernflower decompiler)
    //
    
    package com.android.pc.util;
    
    import java.security.MessageDigest;
    
    public class MD5 {
        public MD5() {
        }
    
        public static final String Md5(String s) {
            char[] hexDigits = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
    
            try {
                byte[] e = s.getBytes("UTF-8");
                MessageDigest mdTemp = MessageDigest.getInstance("MD5");
                mdTemp.update(e);
                byte[] md = mdTemp.digest();
                int j = md.length;
                char[] str = new char[j * 2];
                int k = 0;
    
                for(int i = 0; i < j; ++i) {
                    byte byte0 = md[i];
                    str[k++] = hexDigits[byte0 >>> 4 & 15];
                    str[k++] = hexDigits[byte0 & 15];
                }
    
                return new String(str);
            } catch (Exception var10) {
                return null;
            }
        }
    }
    

    商户号以及预付款ID这个必须是服务端同事给定的值,在APP端是无法代码生成的。 
    那么整个微信支付的代码工作到这里就结束了。这里我将自己封装的支付类贴出来,仅供参考。

    public class WX_Pay {
    
        public IWXAPI api;
        private PayReq req;
    
        public WX_Pay(Context context) {
    
            api = WXAPIFactory.createWXAPI(context, "wxAPPID",false);
        }
    
        /**
         * 向微信服务器发起的支付请求
         */
        public void pay(String appid,String partnerid,String prepayid) {
    
            req = new PayReq();
    
            req.appId = appid;//APPID
            req.partnerId = partnerid;//    商户号
            req.prepayId = prepayid;//  预付款ID
            req.nonceStr = getRoundString();//随机数
            req.timeStamp = getTimeStamp();//时间戳
            req.packageValue = "Sign=WXPay";//固定值Sign=WXPay
    
            String sign = getSign();
            req.sign = sign;//签名
    
            api.registerApp("wxAPPID");
            api.sendReq(req);
        }
    
        @NonNull
        private String getSign() {
            Map<String, String> map = new HashMap<>();
            map.put("appid", req.appId);
            map.put("partnerid", req.partnerId);
            map.put("prepayid", req.prepayId);
            map.put("package", req.packageValue);
            map.put("noncestr", req.nonceStr);
            map.put("timestamp", req.timeStamp);
    
            ArrayList<String> sortList = new ArrayList<>();
            sortList.add("appid");
            sortList.add("partnerid");
            sortList.add("prepayid");
            sortList.add("package");
            sortList.add("noncestr");
            sortList.add("timestamp");
            sort(sortList);
    
            String md5 = "";
            int size = sortList.size();
            for (int k = 0; k < size; k++) {
                if (k == 0) {
                    md5 += sortList.get(k) + "=" + map.get(sortList.get(k));
                } else {
                    md5 += "&" + sortList.get(k) + "=" + map.get(sortList.get(k));
                }
            }
            String stringSignTemp = md5+"&key=商户密钥";
    
            String sign=MD5.Md5(stringSignTemp).toUpperCase();
    
            return sign;
        }
    
        private String getRoundString() {
    
            Random random = new Random();
    
            return random.nextInt(10000) + "";
        }
    
        private String getTimeStamp() {
            return new Date().getTime() / 10 + "";
        }
    
    
        private static void sort(ArrayList<String> strings) {
            Collections.sort(strings);
        }
    }
    

    那么在APP中这样使用就好

    WX_Pay pay = new WX_Pay(getContext());
    pay.pay(str1,str2,str3);

    5,错误小结:本人在开发中遇到过两个错误 
    a,无法起调微信支付界面:错误原因是没有将WXPayEntryActivity 类放在在wxapi包下。 
    b,支付失败:错误原因是在签名算法中忘记将商户密钥签名。 
    这里基本可以总结下错误类型: 
    1,起调失败:工程配置错误 
    2,支付订单报错:订单信息错误 
    c,千万注意微信支付要编译为release版才能通过支付测试

    展开全文
  • 微信支付接入

    2019-05-07 09:22:35
    第1章 微信支付接入 2 第2章 微信小程序申请微信支付 3 2.1 申请微信支付 3 2.2 微信审核 3 2.3 账户参数说明 4 第3章 微信公众号申请微信支付 5 3.1 支付申请 5 3.2 提交资料 6 3.3 填写商户信息 6 3.4 填写结算...
  • 安卓微信的api,个人微信开发API协议,微信 ipad sdk,微信ipad协议,微信web版接口api,微信网页版接口,微信电脑版sdk,微信开发sdk,微信开发API,微信协议,微信接口文档sdk,替代微信ipad协议的api接口,网页...
  • 微信硬件设备接入接口协议 (公开使用) Tencent Technologies Co., Ltd. 腾讯科技有限公司 All rights reserved 产品版本 密级 V2.0Beta 请输入密级:公开 Tencent. 腾讯科技有限公司 项目名称: 微信硬件...
  • https协议,在http基础上多了层加密协议ssl,一般单向认证(浏览器直接请求https网站),和双向认证(使用U盾通过https访问银行) 但微信服务器是不会管你第三方服务器的证书的!也就是不会跟你要公钥!所以直接自生成一...
  • 微信公众号
  • 1.我们要接入js安全接口(公众号设置=》功能设置=》js安全域名) 2.引入js是必要的(http://res.wx.qq.com/open/js/jweixin-1.2.0.js) 3配置wx.config wx.config({ debug: true, // 开启调试模式,调用的所有api的...
  • 最近为公司开发一个新功能,具体是什么不重要,主要是这个功能需要对接微信支付,需要在微信页面调起微信支付 基本上我也是初次接触微信支付的对接,所以我先去看了微信的支付开发文档地址如下: ...
  • 前段时间在一个App中接入微信支付功能,想来也稳定运行快一个月了,回头想想自己接入微信支付时候踩过的坑,决定写一篇自己当初想要搜寻的文章,文章准备分3篇完成。 第一篇:微信支付前期准备 第二篇:微信...
  • 微信开发sdk协议

    2019-05-22 15:12:50
    微信开发sdk协议,出自冬天不穿秋裤,天冷也要风度的程序猿之手,必属精品! 一、网络通讯协议 如上图,采用 datalength+databytes 的自定义长度的协议,其中: datalength:紧跟其后的databytes的数据长度(不...
  • 第三方微信接入登录流程整理 准备工作 1.在微信开放平台https://open.weixin.qq.com/注册成为开发者。 2.在“管理中心”中创建一个移动应用,需“应用名称、简介、及28*28和108*108的PNG图片各一张,且大小不超过...
  • 1、网页授权:(参阅:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842) 登陆公众号,开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息 设置 授权回调域名(请勿加 ...
  • 个人微信开发API协议

    2019-10-25 17:22:31
    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,...安卓微信的api,个人微信开发API协议,微信 ipad sdk,微信ipad协议,微信web版接口api,微信网页版接口,微信电脑版sdk,微信开发sdk,微信开发A...
  • 本文阐述如何从零开始接入小程序支付,尤其适合没有微信支付接入经验的开发者。1. 申请微信支付小程序认证以后,可以在小程序后台,微信支付菜单栏,申请微信支付。填写企业信息和对公账户,微信支付会打一笔随机...
  • 微信开发协议

    2019-11-01 17:25:48
    安卓微信的api,个人微信开发API协议,微信 ipad sdk,微信ipad协议,微信web版接口api,微信网页版接口,微信电脑版sdk,微信开发sdk,微信开发API,微信协议,微信接口文档sdk,替代微信ipad协议的api接口,网页...
  • 微信二次开发接口

    2019-11-08 14:01:48
    安卓微信的api,个人微信开发API协议,微信 ipad sdk,微信ipad协议,微信web版接口api,微信网页版接口,微信电脑版sdk,微信开发sdk,微信开发API,微信协议,微信接口文档sdk,替代微信ipad协议的api接口,网页...
1 2 3 4 5 ... 20
收藏数 10,968
精华内容 4,387
关键字:

微信开发接入https协议