# 申请你的 AppID

注：本文为微信 WP8 终端开发工具的新手使用教程，只涉及教授 SDK 的使用方法，默认读者已经熟悉 VS2012 的基本使用方法，以及具有一定的编程知识基础等。

## 1、申请你的 AppID

请到开发者应用登记页面进行登记，登记并选择移动应用进行设置后，将获得 AppID，可立即用于开发。但应用登记完成后还需要提交审核，只有审核通过的应用才能正式发布使用。

## 2、微信终端 SDK 开发包

SDK 开发包包含 3 个文件：

- `MicroMsgSDK.dll`：每个第三方应用必须要导入该 SDK 库，用于实现与微信的交互
- `MicroMsgSDK.XML`：API 文档，放到与 `MicroMsgSDK.dll` 相同的目录，在 VS 中可以提供帮助，如查看函数注释
- `Google.ProtocolBuffersLite.dll`：Google 的 ProtocolBuffer 开源库，用于序列化数据，引入即可

请前往 [资源下载页](/doc/oplatform/Mobile_App/Downloads/Android_Resource) 下载最新 SDK 包。

## 3、搭建开发环境

1）在 VS2012 中建立你的工程。

2）如下图所示，右键点击工程的 References，在快捷菜单中选择「Add References」，在打开的弹出框上点击「Browser」按钮，然后选择 WP8 平台 SDK 开发包中的两个 dll 文件。

![](https://res.wx.qq.com/op_res/Pxeq1OIahX72Wi4F-eVZv6TiPzwCuwd-oR9cpcJE-bNMcug6O9qjVSyMOA4z1gr6)

3）引入 SDK 的 dll 后，在 References 下可以看到引入的 dll 库（如下图所示）。

![](https://res.wx.qq.com/op_res/uyxyxP75huQAeiQLAzvDps-EjlTNuqtE3xg8wdaKzvBpr7n-FcIB0gAeVEoe_NDg)

SDK 的名字空间为 `MicroMsg.sdk`，在使用前先导入此名字空间：

```csharp
using MicroMsg.sdk;
```

## 4、在代码中使用 SDK 开发包

### 4.1 发送请求或响应到微信

现在，你的程序要发送请求或响应给微信，可以通过 IWXAPI 的 `sendReq` 和 `sendResp` 两个函数来实现。

- `boolean sendReq(BaseReq req);`：第三方 app 主动发送请求给微信，发送请求后会拉起微信应用，微信对请求进行处理后，会发送响应回 App
- `boolean sendResp(BaseResp resp);`：微信先向第三方 app 发送请求，拉起第三方 App 界面，当用户操作完成后，第三方 app 通过 `sendResp` 发送响应数据给微信，拉起微信界面

**sendReq 示例：**

```csharp
try
{
    int scene = SendMessageToWX.Req.WXSceneSession; // 发给微信朋友
    WXTextMessage message = new WXTextMessage();
    message.Title = "文本";
    message.Text = "这是一段文本内容";
    SendMessageToWX.Req req = new SendMessageToWX.Req(message, scene);
    IWXAPI api = WXAPIFactory.CreateWXAPI(AppID);
    api.SendReq(req);
}
catch (WXException ex)
{
    MessageBox.Show(ex.Message);
}
```

`AppID` 为你在微信开放平台网站上登记应用得到的 AppID。

需要注意的是，`SendMessageToWX.Req` 的 `scene` 参数：

- 如果 scene 填 `WXSceneSession`，消息会发送给微信好友
- 如果 scene 填 `WXSceneTimeline`，消息会发送至朋友圈
- 如果 scene 填 `WXSceneChooseByUser`，由用户来选择发送给好友还是发到朋友圈
- scene 默认值为 `WXSceneChooseByUser`

**sendResp 示例：**

```csharp
try
{
    WXTextMessage message = new WXTextMessage();
    message.Title = "文本";
    message.Text = "这是一段文本内容";
    GetMessageFromWX.Resp resp = new GetMessageFromWX.Resp(req.Transaction, req.Username, message);
    IWXAPI api = WXAPIFactory.CreateWXAPI(AppID);
    api.SendResp(resp);
}
catch (WXException ex)
{
    MessageBox.Show(ex.Message);
}
```

`req` 为微信向你的应用发送请求时传过来的数据对象。

具体要发送的内容由第三方 app 开发者定义，SDK 支持文本、图片、文件、链接、表情、音乐、视频、自定义等多种消息内容。具体可参考 Demo 源码。

### 4.2 处理微信的请求和响应

如果你的程序需要接收微信发送的请求和响应，需要下面 4 步操作：

**a. 修改 WMAppManifest.xml**

右键点击应用的 Properties 下的 `WMAppManifest.xml`，选择「Open with...」，然后选择「Xml (Text) Editor」打开该文件。添加以下标签代码：

![](https://res.wx.qq.com/op_res/HcNSB1Db-y1SwjkczqTXcO_uejo-w5dA4zEyFK85llvXQSzTYoHRkhcdPQgW4B2Rg)

上面 XML 片段中有两处需要修改的：

1）`Name="SDK_DEMO"`：改成任意你喜欢的名字

2）两个支持的 FileType：一个是 `.wechatapp`，另外一个是 `.wx3b34a14b66641dfd`，其中 `wx3b34a14b66641dfd` 改成你在微信开放平台上登记应用时得到的 AppID，这个务必要写对，不然微信拉不起你的应用

**b. 编写微信入口 Page 类**

继承 `WXEntryBasePage` 类，并覆写下表中的函数，来处理来自微信的请求和响应。微信发送的数据已经填到了参数中，可直接取用。

注意：如果覆写 `OnNavigatedTo` 函数，需要调用 `base.OnNavigatedTo`，以保证父类中的逻辑得以执行。

![](https://res.wx.qq.com/op_res/hnVzZLbUZy8YC40o8T5QNS0z5rEwac2EiaCcnG_RekuaXrPS48vcx-ydbN6LChOv)

**c. 继承系统的 UriMapperBase 类**

大致逻辑如下：

```csharp
class AssociationUriMapper : UriMapperBase
{
    private string tempUri;
    public override Uri MapUri(Uri uri)
    {
        tempUri = uri.ToString();
        // 根据文件类型打开程序
        if (tempUri.Contains("/FileTypeAssociation"))
        {
            // 获取 fileID (after "fileToken=")
            int fileIDIndex = tempUri.IndexOf("fileToken=") + 10;
            string fileID = tempUri.Substring(fileIDIndex);
            // 获取文件名
            string incommingFileName = SharedStorageAccessManager.GetSharedFileName(fileID);
            // 获取文件后缀
            int extensionIndex = incommingFileName.LastIndexOf('.') + 1;
            string incommingFileType = incommingFileName.Substring(extensionIndex).ToLower();
            // 根据不同文件类型，跳转不同参数的地址
            switch (incommingFileType)
            {
                case "wx3b34a14b66641dfd":
                    return new Uri("/DemoEntryPage.xaml?fileToken=" + fileID, UriKind.Relative);
                default:
                    return new Uri("/MainPage.xaml", UriKind.Relative);
            }
        }
        else
        {
            return uri;
        }
    }
}
```

- `case 'wx3b34a14b66641dfd'`：改成你的 AppID
- `"/DemoEntryPage.xaml?fileToken="`：改成步骤 b 中继承 `WXEntryBasePage` 的 Page 的路径

**d. 修改 App.xaml.cs 文件**

在 `App.xaml.cs` 的 `InitializePhoneApplication()` 函数中，增加一行代码：

```csharp
// Assign the URI-mapper class to the application frame.
RootFrame.UriMapper = new AssociationUriMapper();
```

**注意事项**

1）在测试的时候，确保你安装的 WP8 的微信（4.0 以上版本）

2）不要在 Demo 的基础上修改来形成你的应用程序，因为如果其他人跟你一样做，你们的 AppStore 上的 AppID 是一样的

[微信 SDK Sample Demo 源码](https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/WeChatSDK_sample_WP8.zip)
