---
url: "https://pay.weixin.qq.com/doc/v2/partner/4011941201.md"
title: "APP端开发步骤"
doc_id: 4011941201
---

>更新时间：2025.05.16

## IOS系统opensdk升级指引

由于苹果公司在iOS13系统回收了查询 App bundleID 的能力，导致微信无法保证授权凭证能正确返回给AppID对应的应用。为此，微信支付强烈要求所有商户尽快升级到OpenSDK1.8.6，并让用户及时更新APP，否则安全风险将一直存在。谢谢配合！

详细OpenSDK升级指引请参见：[opensdk升级指引](https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/iOS.html)

注意：

opensdk升级后请一定按照文档要求完成验证工作，确保opensdk升级成功。

![](https://gtimg.wechatpay.cn/resource/xres/mmpaydoc/static/img/59dda4e79764acf3bfc851bfacd91996.png)

（以上截图来自opensdk升级指引）

## IOS开发要点说明

以下项目开发环境以Xcode6，运行环境为IOS7.0为例，说明其开发中需要的操作。

1、项目设置APPID

商户在微信开放平台申请开发APP应用后，微信开放平台会生成APP的唯一标识APPID。在Xcode中打开项目，设置项目属性中的URL Schemes为子商户的APPID。如图8.7标红位置所示。

![](https://gtimg.wechatpay.cn/resource/xres/mmpaydoc/static/img/25cd4ad504ec8f27ce0ff07ca8b21072.png)

图8.7

2、注册APPID

APP工程中引入微信lib库和头文件，调用API前，需要先向微信注册子商户的APPID，代码如下：

\[WXApi registerApp：@"wxd930ea5d5a258f4f" withDescription：@"demo 2.0"\];

3、调起支付

子商户调用“服务商提供的接口”返回支付数据，在APP发起支付。以下是调起微信支付的关键代码：

```
PayReq *request = [[[PayReq alloc] init] autorelease];
request.partnerId = @"10000100";//子商户的商户号
request.prepayId= @"1101000000140415649af9fc314aa427";
request.package = @"Sign=WXPay";
request.nonceStr= @"a462b76e7436e98e0ed6e13c64b4fd1c";
request.timeStamp= @"1397527777";
request.sign= @"582282D72DD2B03AD892830965F428CB16E7A256";
[WXApi sendReq：request];
```

4、支付结果回调

照微信SDK Sample，在类实现onResp函数，支付完成后，微信APP会返回到商户APP并回调onResp函数，开发者需要在该函数中接收，判断返回错误码，再调用服务商提供接口查询支付结果，最后展示用户实际支付结果。注意：一定不能以客户端返回作为用户支付的结果，应以后台的接收的支付通知或查询API返回的结果为准。代码示例如下：

```
-(void)onResp：(BaseResp*)resp{
  if ([respisKindOfClass：[PayRespclass]]){
    PayResp*response=(PayResp*)resp;
    switch(response.errCode){
      caseWXSuccess：
        //服务器端查询支付通知或查询API返回的结果再提示成功
        NSlog(@"支付成功");
      	break;
      default：
      	NSlog(@"支付失败，retcode=%d",resp.errCode);
      	break;
    }
  }
}

```

回调中errCode值列表：

| 名称 | 描述 | 解决方案 |
| --- | --- | --- |
| 0 | 成功 | 展示成功页面 |
| -1 | 错误 | 可能的原因：签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。 |
| -2 | 用户取消 | 无需处理。发生场景：用户不支付了，点击取消，返回APP。 |

## Android开发要点说明

1、后台设置

商户在微信开放平台申请开发应用后，微信开放平台会生成APP的唯一标识APPID。由于需要保证支付安全，需要在开放平台绑定商户应用包名和应用签名，设置好后才能正常发起支付。设置界面在【开放平台】中的栏目【管理中心 / 修改应用 / 修改开发信息】里面，如图8.8红框内所示。

![](https://gtimg.wechatpay.cn/resource/xres/mmpaydoc/static/img/97ca8fa630a560586ff5792af731e343.png)

图8.8

应用包名：是在APP项目配置文件AndroidManifest.xml中声明的package值，例如DEMO中的package="net.sourceforge.simcpux"。

应用签名：根据项目的应用包名和编译使用的keystore，可由签名工具生成一个32位的md5串，在调试的手机上安装签名工具后，运行可生成应用签名串，如图8.9所示，绿色串即应用签名。点击下载[签名生成工具](https://res.wx.qq.com/wxdoc/dist/assets/media/Gen_Signature_Android.e481f889.zip)

![](https://gtimg.wechatpay.cn/resource/xres/mmpaydoc/static/img/291b0a4020e3218c468cec402ec0b77a.png)

图8.9

2、注册APPID

商户APP工程中引入微信JAR包，调用API前，需要先向微信注册子商户的APPID，代码如下：

```
final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
// 将该app注册到微信
msgApi.registerApp("wxd930ea5d5a258f4f");
```

3、调起支付

子商户调用“服务商提供的接口”返回支付数据，在APP发起支付。以下是调起微信支付的关键代码：

```
IWXAPI api;
PayReq request = new PayReq();
request.appId = "wxd930ea5d5a258f4f";//子商户appid
request.partnerId = "1900000109";//子商户号
request.prepayId= "1101000000140415649af9fc314aa427";
request.packageValue = "Sign=WXPay";
request.nonceStr= "1101000000140429eb40476f8896f4c9";
request.timeStamp= "1398746574";
request.sign= "7FFECB600D7157C5AA49810D2D8F28BC2811827B";
api.sendReq(request);
```

4、支付结果回调

参考微信[openSDK](https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/Android.html)，在商户包名.wxapi包路径中实现WXPayEntryActivity类(包名或类名不一致会造成无法回调)，在WXPayEntryActivity类中实现onResp函数，支付完成后，微信APP会返回到商户APP并回调onResp函数，开发者需要在该函数中接收通知，判断返回错误码，支付成功则调用“服务商提供的查询接口”获取到支付状态再展示用户实际支付结果。注意一定不能以客户端返回作为用户支付的结果，应以服务器端的接收的支付通知或查询API返回的结果为准。代码示例如下：

注意：

- 开发微信支付需要实现WXPayEntryActivity类，否则可能支付完成后，无法从微信内返回到商户APP。

- Android13开始Intent过滤器会屏蔽不匹配的intent，存在无法返回商户APP的问题，解决方法：在manifest中，去除WXPayEntryActivity的intent-filter。


```
<activity
    android:name=".wxapi.WXPayEntryActivity"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.Translucent.NoTitleBar"
    android:exported="true"
    android:taskAffinity="填写你的包名"
    android:launchMode="singleTask">
</activity>
```
```
publicvoidonResp(BaseRespresp){
  if(resp.getType()==ConstantsAPI.COMMAND_PAY_BY_WX){
      Log.d(TAG,"onPayFinish,errCode="+resp.errCode);
      AlertDialog.Builderbuilder=newAlertDialog.Builder(this);
      builder.setTitle(R.string.app_tip);
   }
}
```

回调中errCode值列表：

| 名称 | 描述 | 解决方案 |
| --- | --- | --- |
| 0 | 成功 | 展示成功页面 |
| -1 | 错误 | 可能的原因：签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。 |
| -2 | 用户取消 | 无需处理。发生场景：用户不支付了，点击取消，返回APP。 |

## 鸿蒙开发要点说明

1、配置鸿蒙应用信息

前往[微信开放平台](https://open.weixin.qq.com/)，在「管理中心 \- 移动应用 \- 详情 \- 开发配置」中点击「编辑」进入修改开发信息的页面，继续在「平台信息」板块中填入鸿蒙应用所需的 Bundle ID 和 identifier 信息，然后提交审核，等待审核通过即可。

![](https://gtimg.wechatpay.cn/resource/xres/mmpaydoc/static/img/e8d516709c342e96fea7f0590b81d1f2.png)

关于「鸿蒙应用」中的 Bundle ID、Identifier、以及应用下载地址的提供的说明如下：

- Bundle ID 指的是鸿蒙应用的包名，[详情可点击查看](https://developer.huawei.com/consumer/cn/doc/app/agc-help-createharmonyapp-0000001945392297)

- Identifier 指的是鸿蒙应用的 appIdentifier，[详情可点击查看](https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-bundlemanager-bundleinfo-V5)


注意事项：

- 对于 App 已上架 Android 或iOS 应用市场的应用，千万别选择【未上架任何应用市场】，此选项意思是 Android、iOS 和鸿蒙都尚未上架应用市场，而未上架应用市场的应用使用微信能力则有如下的限制，因此开发者需谨慎操作


![](https://gtimg.wechatpay.cn/resource/xres/mmpaydoc/static/img/4b18d1363fb464f05c18cb1c64cf309c.png)

- 因此，对于 App 已上架 Android 或iOS 应用市场的应用，需选择【已上架至少一个应用市场】，但需填写 App 备案号


![](https://gtimg.wechatpay.cn/resource/xres/mmpaydoc/static/img/54ee246224da00d021ecacf598c1a4d9.png)

- 即，对于 Android 和 iOS 已上架的应用，在下面的配置中一定要选择【是】


![](https://gtimg.wechatpay.cn/resource/xres/mmpaydoc/static/img/6e9108bea0c377b859cc70a3cef81301.png)

2、下载鸿蒙开发的 IDE

前往鸿蒙官网下载 [DevEco Studio NEXT](https://developer.huawei.com/consumer/cn/download/)

3、配置 sdk 依赖

在 DevEco Studio NEXT中打开你的项目，以 [deno 工程](https://dldir1.qq.com/WechatWebDev/opensdk/ohos/OpenSDK-1.0.0.zip)为示例：

修改项目中的oh-package.json5文件，在dependencies中加入微信 opensdk 的依赖项：

```
{
  "name": "demo",
  "version": "1.0.0",
  "description": "Please describe the basic information.",
  "main": "",
  "author": "",
  "license": "",
   "dependencies": {
    "@tencent/wechat_open_sdk": "1.0.0"
  }
}
```

4、配置 sdk 依赖

商户服务器生成支付订单，先调用【[统一下单API](https://pay.weixin.qq.com/doc/v2/partner/4011941377.md)】生成预付单，获取到prepay\_id后将参数再次签名传输给APP发起支付。以下是调起微信支付的关键代码：

```
import * as wxopensdk from '@wechat/open_sdk';

// WXApi 是第三方app和微信通信的openApi接口，其实例通过WXAPIFactory获取，需要传入应用申请到的AppID
export const WXApi = wxopensdk.WXAPIFactory.createWXAPI(APP_ID)

// WXApiEventHandler为微信数据的回调
class WXApiEventHandlerImpl implements wxopensdk.WXApiEventHandler {
  private onReqCallbacks: Map<OnWXReq, OnWXReq> = new Map
  private onRespCallbacks: Map<OnWXResp, OnWXResp> = new Map

  registerOnWXReqCallback(on: OnWXReq) {
    this.onReqCallbacks.set(on, on)
  }
  unregisterOnWXReqCallback(on: OnWXReq) {
    this.onReqCallbacks.delete(on)
  }

  registerOnWXRespCallback(on: OnWXResp) {
    this.onRespCallbacks.set(on, on)
  }
  unregisterOnWXRespCallback(on: OnWXResp) {
    this.onRespCallbacks.delete(on)
  }

  onReq(req: wxopensdk.BaseReq): void {
    Log.i(kTag, "onReq:%s", JSON.stringify(req))
    this.onReqCallbacks.forEach((on) => {
      on(req)
    })
  }

  onResp(resp: wxopensdk.BaseResp): void {
    Log.i(kTag, "onResp:%s", JSON.stringify(resp))
    this.onRespCallbacks.forEach((on) => {
      on(resp)
    })
  }
}
export const WXEventHandler = new WXApiEventHandlerImpl

//调用支付
let req = new wxopensdk.PayReq
req.appId = 'wxd930ea5d5a258f4f'//微信开放平台审核通过的移动应用AppID
req.partnerId = '1900000109'//微信支付商户号
req.prepayId = '1101000000140415649af9fc314aa427'//调用微信支付下单接口返回的支付交易会话ID
req.packageValue = 'Sign=WXPay'//填写固定值Sign=WXPay
req.nonceStr = '1101000000140429eb40476f8896f4c9'//随机字符串，不长于32位
req.timeStamp = '1398746574'//时间戳
req.sign = '7FFECB600D7157C5AA49810D2D8F28BC2811827B'//签名值
// 向微信发送登录请求:
//   context为ohos内置类，app间跳转需依赖该类，开发者可在Component中获取
//   finished为跳转微信的结果：true表示跳转成功；false表示跳转失败，可能是因为微信未安装
let finished = await this.wxApi.sendReq(context: common.UIAbilityContext, req)

// 在EntryAbility中响应来自微信的回调
export default class EntryAbility extends UIAbility {
  onCreate(want: Want, _launchParam: AbilityConstant.LaunchParam): void {
    this.handleWeChatCallIfNeed(want)
  }

  onNewWant(want: Want, _launchParam: AbilityConstant.LaunchParam): void {
    this.handleWeChatCallIfNeed(want)
  }

  private handleWeChatCallIfNeed(want: Want) {
    WXApi.handleWant(want, WXEventHandler)
  }
}
```

注意：

该sign生成字段名列表见[调起支付API](https://pay.weixin.qq.com/doc/v2/partner/4011941437.md)

5、支付结果回调

支付完成后，微信App会返回到商户App并回调onResp函数，开发者需要在该函数中接收通知，判断返回错误码。如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意一定不能以客户端返回作为用户支付的结果，应以服务器端接收的支付通知或查询API返回的结果为准。

示例代码：

```
onResp(resp: wxopensdk.BaseResp): void {
Log.i(kTag, "onResp:%s", JSON.stringify(resp))
 this.onRespCallbacks.forEach((on) => {
 on(resp)
 })
 }
```

回调中errCode值列表：

| 值 | 描述 | 解决方案 |
| --- | --- | --- |
| 0 | 成功 | 展示成功页面 |
| -1 | 错误 | 可能的原因：签名错误、未注册AppID、项目设置AppID不正确、注册的AppID与设置的不匹配、其他异常等 |
| -2 | 用户取消 | 无需处理。发生场景：用户不支付了，点击取消，返回App |