---
url: "https://pay.weixin.qq.com/doc/v3/partner/4012090949.md"
title: "APP调起支付"
doc_id: 4012090949
---

>更新时间：2025.03.28

通过App下单接口获取到发起支付的必要参数prepay\_id，服务商或子商户（也叫特约商户）APP再通过openSDK(详见[安卓](https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/Android.html)/[IOS](https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/iOS.html)/[鸿蒙](https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/ohos.html)接入指引)的sendReq方法拉起微信支付。



## 接口说明

支持商户：【普通服务商】

## 字段说明

### 请求参数

此API签名无后台接口交互，需要将列表中的数据签名

| 参数名 | 类型 | 必填 | 描述 |
| --- |  --- | --- | --- |
| appId | string(32) | true | 微信开放平台审核通过的移动应用AppID ，为二级商户申请的应用AppID。 |
| partnerId | string(32) | true | 请填写商户号mchid对应的值。 |
| prepayId | string(64) | true | 微信返回的支付交易会话ID，该值有效期为2小时。 |
| packageValue | string(128) | true | 暂填写固定值Sign=WXPay<br>注意：如果是ios则请求参数为“package” |
| nonceStr | string(32) | true | 随机字符串，不长于32位。推荐随机数生成算法。 |
| timeStamp | string(10) | true | 时间戳，标准北京时间，时区为东八区，自1970年1月1日 0点0分0秒以来的秒数。注意：部分系统取到的值为毫秒级，需要转换成秒(10位数字)。 |
| sign | string(512) | true | 签名，使用字段AppID、timeStamp、nonceStr、prepayid计算得出的签名值 注意：取值RSA格式 |

请求示例

ios示例代码：

```
PayReq *request = [[[PayReq alloc] init] autorelease];
request.appId = "wxd930ea5d5a258f4f";
request.partnerId = "1900000109";
request.prepayId= "1101000000140415649af9fc314aa427",;
request.package = "Sign=WXPay";
request.nonceStr= "1101000000140429eb40476f8896f4c9";
request.timeStamp= "1398746574";
request.sign= "oR9d8PuhnIc+YZ8cBHFCwfgpaK9gd7vaRvkYD7rthRAZ\/X+QBhcCYL21N7cHCTUxbQ+EAt6Uy+lwSN22f5YZvI45MLko8Pfso0jm46v5hqcVwrk6uddkGuT+Cdvu4WBqDzaDjnNa5UK3GfE1Wfl2gHxIIY5lLdUgWFts17D4WuolLLkiFZV+JSHMvH7eaLdT9N5GBovBwu5yYKUR7skR8Fu+LozcSqQixnlEZUfyE55feLOQTUYzLmR9pNtPbPsu6WVhbNHMS3Ss2+AehHvz+n64GDmXxbX++IOBvm2olHu3PsOUGRwhudhVf7UcGcunXt8cqNjKNqZLhLw4jq\/xDg==";
[WXApi sendReq：request];
```

android示例代码：

```
IWXAPI api;
PayReq request = new PayReq();
request.appId = "wxd930ea5d5a258f4f";
request.partnerId = "1900000109";
request.prepayId= "1101000000140415649af9fc314aa427",;
request.packageValue = "Sign=WXPay";
request.nonceStr= "1101000000140429eb40476f8896f4c9";
request.timeStamp= "1398746574";
request.sign= "oR9d8PuhnIc+YZ8cBHFCwfgpaK9gd7vaRvkYD7rthRAZ\/X+QBhcCYL21N7cHCTUxbQ+EAt6Uy+lwSN22f5YZvI45MLko8Pfso0jm46v5hqcVwrk6uddkGuT+Cdvu4WBqDzaDjnNa5UK3GfE1Wfl2gHxIIY5lLdUgWFts17D4WuolLLkiFZV+JSHMvH7eaLdT9N5GBovBwu5yYKUR7skR8Fu+LozcSqQixnlEZUfyE55feLOQTUYzLmR9pNtPbPsu6WVhbNHMS3Ss2+AehHvz+n64GDmXxbX++IOBvm2olHu3PsOUGRwhudhVf7UcGcunXt8cqNjKNqZLhLw4jq\/xDg==";
api.sendReq(request);
```

鸿蒙示例代码：

```
IWXAPI api;
let req = new wxopensdk.PayReq
req.appId = 'wxd930ea5d5a258f4f'
req.partnerId = '1900000109'
req.prepayId = '1101000000140415649af9fc314aa427'
req.packageValue = 'Sign=WXPay'
req.nonceStr = '1101000000140429eb40476f8896f4c9'
req.timeStamp = '1398746574'
req.sign = 'oR9d8PuhnIc+YZ8cBHFCwfgpaK9gd7vaRvkYD7rthRAZ\/X+QBhcCYL21N7cHCTUxbQ+EAt6Uy+lwSN22f5YZvI45MLko8Pfso0jm46v5hqcVwrk6uddkGuT+Cdvu4WBqDzaDjnNa5UK3GfE1Wfl2gHxIIY5lLdUgWFts17D4WuolLLkiFZV+JSHMvH7eaLdT9N5GBovBwu5yYKUR7skR8Fu+LozcSqQixnlEZUfyE55feLOQTUYzLmR9pNtPbPsu6WVhbNHMS3Ss2+AehHvz+n64GDmXxbX++IOBvm2olHu3PsOUGRwhudhVf7UcGcunXt8cqNjKNqZLhLw4jq\/xDg=='
api.sendReq(context: common.UIAbilityContext, req)
```

### 应答参数

用户从微信收银台返回商户APP时openSDK会onResp回调，商户可通过回调errCode参数展示相应支付结果。

注：前端回调并不保证它绝对可靠，不可只依赖前端回调判断订单支付状态，订单状态需以后端[合单查询订单](https://pay.weixin.qq.com/doc/v3/partner/4012761049.md)和[支付通知](https://pay.weixin.qq.com/doc/v3/partner/4012237246.md)为准。

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

返回示例

ios示例代码：

```
-(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;
      }
  }
}
```

android示例代码：

```
public void onResp(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);
    }
}
```

鸿蒙示例代码：

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

## App调起支付的参数需要按照签名规则进行签名计算

### 1、构造签名串

```
签名串一共有四行，每一行为一个参数。行尾以\n（换行符，ASCII编码值为0x0A）结束，包括最后一行。
如果参数本身以\n结束，也需要附加一个\n
```

参与签名字段及格式：

```
应用ID
时间戳
随机字符串
预支付交易会话ID
```

数据举例：

```
wx8888888888888888
1414561699
5K8264ILTKCH16CQ2502SI8ZNMTM67VS
WX1217752501201407033233368018
```

### 2、计算签名值

绝大多数编程语言提供的签名函数支持对签名数据 进行签名。强烈建议商户调用该类函数，使用商户私钥对待签名串进行SHA256 with RSA签名，并对签名结果进行Base64编码得到签名值。

下面我们使用命令行演示如何生成签名

```
$ echo -n -e \
"wx8888888888888888\n1414561699\n5K8264ILTKCH16CQ2502SI8ZNMTM67VS\nWX1217752501201407033233368018\n" \
  | openssl dgst -sha256 -sign apiclient_key.pem \
  | openssl base64 -A
uOVRnA4qG/MNnYzdQxJanN+zU+lTgIcnU9BxGw5dKjK+VdEUz2FeIoC+D5sB/LN+nGzX3hfZg6r5wT1pl2ZobmIc6p0ldN7J6yDgUzbX8Uk3sD4a4eZVPTBvqNDoUqcYMlZ9uuDdCvNv4TM3c1WzsXUrExwVkI1XO5jCNbgDJ25nkT/c1gIFvqoogl7MdSFGc4W4xZsqCItnqbypR3RuGIlR9h9vlRsy7zJR9PBI83X8alLDIfR1ukt1P7tMnmogZ0cuDY8cZsd8ZlCgLadmvej58SLsIkVxFJ8XyUgx9FmutKSYTmYtWBZ0+tNvfGmbXU7cob8H/4nLBiCwIUFluw==
```