微信支付 如何与服务器端,微信支付-普通下单开发者文档

3.2. API接入(含示例代码)

本文档展示了如何使用微信支付服务端 SDK 快速接入APP支付产品,完成与微信支付对接的部分。

注意:

文档中的代码示例是用来阐述 API 基本使用方法,代码中的示例参数需替换成商户自己账号及参数才能跑通。

以下接入步骤仅提供参考,请商户结合自身业务需求进行评估、修改。

3.2.1. 【服务端】APP下单

步骤说明:用户在商户APP内完成商户选择后进入支付页面,商户需要通过后端请求该APP下单API来获取预支付ID。

示例代码

public void CreateOrder() throws Exception{

//请求URL

HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/pay/transactions/app");

// 请求body参数

String reqdata = "{"

+ "\"time_expire\":\"2018-06-08T10:34:56+08:00\","

+ "\"amount\": {"

+ "\"total\":100,"

+ "\"currency\":\"CNY\""

+ "},"

+ "\"mchid\":\"1230000109\","

+ "\"description\":\"Image形象店-深圳腾大-QQ公仔\","

+ "\"notify_url\":\"https://www.weixin.qq.com/wxpay/pay.php\","

+ "\"out_trade_no\":\"1217752501201407033233368018\","

+ "\"goods_tag\":\"WXG\","

+ "\"appid\":\"wxd678efh567hg6787\","

+ "\"attach\":\"自定义数据说明\","

+ "\"detail\": {"

+ "\"invoice_id\":\"wx123\","

+ "\"goods_detail\": ["

+ "{"

+ "\"goods_name\":\"iPhoneX 256G\","

+ "\"wechatpay_goods_id\":\"1001\","

+ "\"quantity\":1,"

+ "\"merchant_goods_id\":\"商品编码\","

+ "\"unit_price\":828800"

+ "},"

+ "{"

+ "\"goods_name\":\"iPhoneX 256G\","

+ "\"wechatpay_goods_id\":\"1001\","

+ "\"quantity\":1,"

+ "\"merchant_goods_id\":\"商品编码\","

+ "\"unit_price\":828800"

+ "}"

+ "],"

+ "\"cost_price\":608800"

+ "},"

+ "\"scene_info\": {"

+ "\"store_info\": {"

+ "\"address\":\"广东省深圳市南山区科技中一道10000号\","

+ "\"area_code\":\"440305\","

+ "\"name\":\"腾讯大厦分店\","

+ "\"id\":\"0001\""

+ "},"

+ "\"device_id\":\"013467007045764\","

+ "\"payer_client_ip\":\"14.23.150.211\""

+ "}"

+ "}";

StringEntity entity = new StringEntity(reqdata);

entity.setContentType("application/json");

httpPost.setEntity(entity);

httpPost.setHeader("Accept", "application/json");

//完成签名并执行请求

CloseableHttpResponse response = httpClient.execute(httpPost);

try {

int statusCode = response.getStatusLine().getStatusCode();

if (statusCode == 200) { //处理成功

System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));

} else if (statusCode == 204) { //处理成功,无返回Body

System.out.println("success");

} else {

System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));

throw new IOException("request failed");

}

} finally {

response.close();

}

}

try {

$resp = $client->request(

'POST',

'https://api.mch.weixin.qq.com/v3/pay/transactions/app', //请求URL

[

// JSON请求体

'json' => [

"time_expire" => "2018-06-08T10:34:56+08:00",

"amount" => [

"total" => 100,

"currency" => "CNY",

],

"mchid" => "1230000109",

"description" => "Image形象店-深圳腾大-QQ公仔",

"notify_url" => "https://www.weixin.qq.com/wxpay/pay.php",

"out_trade_no" => "1217752501201407033233368018",

"goods_tag" => "WXG",

"appid" => "wxd678efh567hg6787",

"attach" => "自定义数据说明",

"detail" => [

"invoice_id" => "wx123",

"goods_detail" => [

[

"goods_name" => "iPhoneX 256G",

"wechatpay_goods_id" => "1001",

"quantity" => 1,

"merchant_goods_id" => "商品编码",

"unit_price" => 828800,

],

[

"goods_name" => "iPhoneX 256G",

"wechatpay_goods_id" => "1001",

"quantity" => 1,

"merchant_goods_id" => "商品编码",

"unit_price" => 828800,

],

],

"cost_price" => 608800,

],

"scene_info" => [

"store_info" => [

"address" => "广东省深圳市南山区科技中一道10000号",

"area_code" => "440305",

"name" => "腾讯大厦分店",

"id" => "0001",

],

"device_id" => "013467007045764",

"payer_client_ip" => "14.23.150.211",

]

],

'headers' => [ 'Accept' => 'application/json' ]

]

);

$statusCode = $resp->getStatusCode();

if ($statusCode == 200) { //处理成功

echo "success,return body = " . $resp->getBody()->getContents()."\n";

} else if ($statusCode == 204) { //处理成功,无返回Body

echo "success";

}

} catch (RequestException $e) {

// 进行错误处理

echo $e->getMessage()."\n";

if ($e->hasResponse()) {

echo "failed,resp code = " . $e->getResponse()->getStatusCode() . " return body = " . $e->getResponse()->getBody() . "\n";

}

return;

}

func CreateOrder() {

// 初始化客户端

ctx := context.TODO()

opts, err := SetUp()

if err != nil {

return

}

client, err := core.NewClient(ctx, opts...,)

if err != nil{

log.Printf("init client err:%s",err)

return

}

//设置请求地址

URL := "https://api.mch.weixin.qq.com/v3/pay/transactions/app"

//设置请求信息,此处也可以使用结构体来进行请求

mapInfo := map[string]interface{}{

"mchid": "1900006XXX",

"out_trade_no": "APP1217752501201407033233368018",

"appid": "wxb4ba3c02aa476XXX",

"description": "Image形象店-深圳腾大-QQ公仔",

"notify_url": "https://weixin.qq.com/",

"amount": map[string]interface{}{

"total": 1,

"currency": "CNY",

},

}

// 发起请求

response, err := client.Post(ctx, URL, mapInfo)

if err != nil{

log.Printf("client post err:%s",err)

return

}

// 校验回包内容是否有逻辑错误

err = core.CheckResponse(response)

if err != nil{

log.Printf("check response err:%s",err)

return

}

// 读取回包信息

body, err := ioutil.ReadAll(response.Body)

if err != nil{

log.Printf("read response body err:%s",err)

return

}

fmt.Println(string(body))

}

重要参数说明:

• out_trade_no:商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一

• description:商品描述

• notify_url:支付回调通知URL,该地址必须为直接可访问的URL,不允许携带查询串

• total:订单总金额,单位为分

更多参数、响应详情及错误码请参见APP下单API接口文档

3.2.2. 【客户端】OpenSDK调起支付

步骤说明:通过APP下单API成功获取预支付交易会话标识(prepay_id)后,需要通过OpenSDK来调起微信支付收银台

该步骤请使用开放平台的官方OpenSDK,可前往OpenSDK地址下载

SDK的调用需要携带签名(参与签名的参数为:appid、partnerid、prepayid、package、noncestr、timestamp,参数区分大小写)

重要入参说明:

package:取固定值Sign=WXPay

signType:该接口V3版本仅支持RSA

paySign:签名

paySign生成规则、响应详情及错误码请参见APP调起支付接口文档

iOS SDK调用说明

一、拉起支付

商户服务器生成支付订单,先调用APP下单API生成预付单,获取到prepay_id后将参数再次签名传输给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]

注意:该sign生成字段名列表见调起支付API

二、SDK结果回调

按照微信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值列表:

名称

描述

解决方案

-2

用户取消

无需处理。发生场景:用户不支付了,点击取消,返回APP。

0

成功

展示成功页面

-1

错误

可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。

Android SDK调用说明

一、SDK拉起支付

商户服务器生成支付订单,先调用APP下单API生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。以下是调起微信支付的关键代码:

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= "7FFECB600D7157C5AA49810D2D8F28BC2811827B";

api.sendReq(request);

注意:该sign生成字段名列表见调起支付API

二、支付结果回调

参照微信SDK Sample,在net.sourceforge.simcpux.wxapi包路径中实现WXPayEntryActivity类(包名或类名不一致会造成无法回调),在WXPayEntryActivity类中实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,

如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。代码示例如下:

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。

3.2.3.【服务端】接收支付结果通知

步骤说明:当用户完成支付,微信会把相关支付结果将通过异步回调的方式通知商户,商户需要接收处理,并按文档规范返回应答

注意:

支付结果通知是以POST 方法访问商户设置的通知url,通知的数据以JSON 格式通过请求主体(BODY)传输。通知的数据包括了加密的支付结果详情

加密不能保证通知请求来自微信。微信会对发送给商户的通知进行签名,并将签名值放在通知的HTTP头Wechatpay-Signature。商户应当验证签名,以确认请求来自微信,而不是其他的第三方。签名验证的算法请参考微信支付API v3签名方案

支付通知http应答码为200或204才会当作正常接收,当回调处理异常时,应答的HTTP状态码应为500,或者4xx

商户成功接收到回调通知后应返回成功的http应答码为200或204

同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。 推荐的做法是,当商户系统收到通知进行处理时,先检查对应业务数据的状态,并判断该通知是否已经处理。如果未处理,则再进行处理;如果已处理,则直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱

对后台通知交互时,如果微信收到商户的应答不符合规范或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。(通知频率为15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h - 总计 24h4m)

更多参数、响应详情及错误码请参见 JSAPI / APP / H5 / Native / 小程序支付通知API接口文档

3.2.4. 【服务端】查询订单

步骤说明:当商户后台、网络、服务器等出现异常,商户系统最终未接收到支付通知时商户可通过查询订单接口核实订单支付状态

示例代码(通过微信订单号查询):

public void QueryOrder() throws Exception {

//请求URL

URIBuilder uriBuilder = new URIBuilder("https://api.mch.weixin.qq.com/v3/pay/transactions/id/4200000745202011093730578574");

uriBuilder.setParameter("mchid", mchId);

//完成签名并执行请求

HttpGet httpGet = new HttpGet(uriBuilder.build());

httpGet.addHeader("Accept", "application/json");

CloseableHttpResponse response = httpClient.execute(httpGet);

try {

int statusCode = response.getStatusLine().getStatusCode();

if (statusCode == 200) {

System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));

} else if (statusCode == 204) {

System.out.println("success");

} else {

System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));

throw new IOException("request failed");

}

} finally {

response.close();

}

}

try {

$resp = $client->request(

'GET',

'https://api.mch.weixin.qq.com/v3/pay/transactions/id/1217752501201407033233368018?mchid=1230000109', //请求URL

[

'headers' => [ 'Accept' => 'application/json']

]

);

$statusCode = $resp->getStatusCode();

if ($statusCode == 200) { //处理成功

echo "success,return body = " . $resp->getBody()->getContents()."\n";

} else if ($statusCode == 204) { //处理成功,无返回Body

echo "success";

}

} catch (RequestException $e) {

// 进行错误处理

echo $e->getMessage()."\n";

if ($e->hasResponse()) {

echo "failed,resp code = " . $e->getResponse()->getStatusCode() . " return body = " . $e->getResponse()->getBody() . "\n";

}

return;

}

func QueryOrder() {

// 初始化客户端

ctx := context.TODO()

opts, err := SetUp()

if err != nil {

return

}

client, err := core.NewClient(ctx, opts...,)

if err != nil{

log.Printf("init client err:%s",err)

return

}

//设置请求地址

URL := "https://api.mch.weixin.qq.com/v3/pay/transactions/id/1217752501201407033233368018?mchid=1900000000"

// 发起请求

response, err := client.Get(ctx, URL)

if err != nil{

log.Printf("client get err:%s",err)

return

}

// 校验回包内容是否有逻辑错误

err = core.CheckResponse(response)

if err != nil{

log.Printf("check response err:%s",err)

return

}

// 读取回包信息

body, err := ioutil.ReadAll(response.Body)

if err != nil{

log.Printf("read response body err:%s",err)

return

}

fmt.Println(string(body))

}

注意:

查询订单可通过微信支付订单号或商户订单号两种方式查询,两种查询方式返回结果相同

更多参数、响应详情及错误码请参见 JSAPI / APP / H5 / Native / 小程序查询订单API接口文档

3.2.5. 【服务端】关闭订单

步骤说明:当商户订单支付失败需要生成新单号重新发起支付,要对原订单号调用关单,避免重复支付;系统下单后,用户支付超时,系统退出不再受理,避免用户继续,请调用关单接口

示例代码:

public void CloseOrder() throws Exception {

//请求URL

HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/sdkphp12345678920201028112429/close");

//请求body参数

String reqdata ="{\"mchid\": \""+mchId+"\"}";

StringEntity entity = new StringEntity(reqdata);

entity.setContentType("application/json");

httpPost.setEntity(entity);

httpPost.setHeader("Accept", "application/json");

//完成签名并执行请求

CloseableHttpResponse response = httpClient.execute(httpPost);

try {

int statusCode = response.getStatusLine().getStatusCode();

if (statusCode == 200) {

System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));

} else if (statusCode == 204) {

System.out.println("success");

} else {

System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));

throw new IOException("request failed");

}

} finally {

response.close();

}

}

try {

$resp = $client->request(

'POST',

'https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/{out_trade_no}/close', //请求URL

[

// JSON请求体

'json' => [

"mchid " => "1230000109",

],

'headers' => [ 'Accept' => 'application/json' ]

]

);

$statusCode = $resp->getStatusCode();

if ($statusCode == 200) { //处理成功

echo "success,return body = " . $resp->getBody()->getContents()."\n";

} else if ($statusCode == 204) { //处理成功,无返回Body

echo "success";

}

} catch (RequestException $e) {

// 进行错误处理

echo $e->getMessage()."\n";

if ($e->hasResponse()) {

echo "failed,resp code = " . $e->getResponse()->getStatusCode() . " return body = " . $e->getResponse()->getBody() . "\n";

}

return;

}

func CloseOrder() {

// 初始化客户端

ctx := context.TODO()

opts, err := SetUp()

if err != nil {

return

}

client, err := core.NewClient(ctx, opts...,)

if err != nil{

log.Printf("init client err:%s",err)

return

}

//设置请求地址

URL := "https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/1217752501201407033233368018/close"

//设置请求信息,此处也可以使用结构体来进行请求

mapInfo := map[string]interface{}{

"mchid": "1900006891",

}

// 发起请求

response, err := client.Post(ctx, URL, mapInfo)

if err != nil{

log.Printf("client post err:%s",err)

return

}

// 校验回包内容是否有逻辑错误

err = core.CheckResponse(response)

if err != nil{

log.Printf("check response err:%s",err)

return

}

// 读取回包信息

body, err := ioutil.ReadAll(response.Body)

if err != nil{

log.Printf("read response body err:%s",err)

return

}

fmt.Println(string(body))

}

注意:

订单生成后不能马上调用关单接口,最短调用时间间隔为5分钟

已支付成功的订单不能关闭

更多参数、响应详情及错误码请参见 JSAPI / APP / H5 / Native / 小程序接口文档

3.2.6. 【服务端】申请交易账单

步骤说明:微信支付按天提供交易账单文件,商户可以通过该接口获取账单文件的下载地址

示例代码:

public void TradeBill() throws Exception {

//请求URL

URIBuilder uriBuilder = new URIBuilder("https://api.mch.weixin.qq.com/v3/bill/tradebill");

uriBuilder.setParameter("bill_date", "2020-11-09");

uriBuilder.setParameter("bill_type", "ALL");

//完成签名并执行请求

HttpGet httpGet = new HttpGet(uriBuilder.build());

httpGet.addHeader("Accept", "application/json");

CloseableHttpResponse response = httpClient.execute(httpGet);

try {

int statusCode = response.getStatusLine().getStatusCode();

if (statusCode == 200) {

System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));

} else if (statusCode == 204) {

System.out.println("success");

} else {

System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));

throw new IOException("request failed");

}

} finally {

response.close();

}

}

try {

$resp = $client->request(

'GET',

'https://api.mch.weixin.qq.com/v3/bill/tradebill?bill_date=2019-06-11&bill_type=ALL', //请求URL

[

'headers' => [ 'Accept' => 'application/json']

]

);

$statusCode = $resp->getStatusCode();

if ($statusCode == 200) { //处理成功

echo "success,return body = " . $resp->getBody()->getContents()."\n";

} else if ($statusCode == 204) { //处理成功,无返回Body

echo "success";

}

} catch (RequestException $e) {

// 进行错误处理

echo $e->getMessage()."\n";

if ($e->hasResponse()) {

echo "failed,resp code = " . $e->getResponse()->getStatusCode() . " return body = " . $e->getResponse()->getBody() . "\n";

}

return;

}

func TradeBill() {

// 初始化客户端

ctx := context.TODO()

opts, err := SetUp()

if err != nil {

return

}

client, err := core.NewClient(ctx, opts...,)

if err != nil{

log.Printf("init client err:%s",err)

return

}

//设置请求地址

URL := "https://api.mch.weixin.qq.com/v3/bill/tradebill?bill_date=2019-06-11&bill_type=ALL"

// 发起请求

response, err := client.Get(ctx, URL)

if err != nil{

log.Printf("client get err:%s",err)

return

}

// 校验回包内容是否有逻辑错误

err = core.CheckResponse(response)

if err != nil{

log.Printf("check response err:%s",err)

return

}

// 读取回包信息

body, err := ioutil.ReadAll(response.Body)

if err != nil{

log.Printf("read response body err:%s",err)

return

}

fmt.Println(string(body))

}

注意:

更多参数、响应详情及错误码请参见 JSAPI / APP / H5 / Native / 小程序接口文档

3.2.7. 【服务端】下载账单

步骤说明:通过申请交易账单接口获取到账单下载地址(download_url)后,再通过该接口获取到对应的账单文件,文件内包含交易相关的金额、时间、营销等信息,供商户核对订单、退款、银行到账等情况

示例代码:

public void DownloadUrl(String download_url) throws Exception{

PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey(new ByteArrayInputStream(privateKey.getBytes("utf-8")));

//初始化httpClient

//该接口无需进行签名验证、通过withValidator((response) -> true)实现

httpClient = WechatPayHttpClientBuilder.create().withMerchant(mchId, mchSerialNo, merchantPrivateKey).withValidator((response) -> true).build();

//请求URL

//账单文件的下载地址的有效时间为30s

URIBuilder uriBuilder = new URIBuilder(download_url);

HttpGet httpGet = new HttpGet(uriBuilder.build());

httpGet.addHeader("Accept", "application/json");

//执行请求

CloseableHttpResponse response = httpClient.execute(httpGet);

try {

int statusCode = response.getStatusLine().getStatusCode();

if (statusCode == 200) {

System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));

} else if (statusCode == 204) {

System.out.println("success");

} else {

System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));

throw new IOException("request failed");

}

} finally {

response.close();

}

}

try {

$resp = $client->request(

'GET',

'https://api.mch.weixin.qq.com/v3/billdownload/file?token=xx', //请求URL

[

'headers' => [ 'Accept' => 'application/json']

]

);

$statusCode = $resp->getStatusCode();

if ($statusCode == 200) { //处理成功

echo "success,return body = " . $resp->getBody()->getContents()."\n";

} else if ($statusCode == 204) { //处理成功,无返回Body

echo "success";

}

} catch (RequestException $e) {

// 进行错误处理

echo $e->getMessage()."\n";

if ($e->hasResponse()) {

echo "failed,resp code = " . $e->getResponse()->getStatusCode() . " return body = " . $e->getResponse()->getBody() . "\n";

}

return;

}

func DownloadUrl() {

// 初始化客户端

ctx := context.TODO()

opts, err := SetUp()

if err != nil {

return

}

client, err := core.NewClient(ctx, opts...,)

if err != nil{

log.Printf("init client err:%s",err)

return

}

//设置请求地址

URL := "https://api.mch.weixin.qq.com/v3/billdownload/file?token=xxx" //申请账单接口获取到的download_url

// 发起请求

response, err := client.Get(ctx, URL)

if err != nil{

log.Printf("client get err:%s",err)

return

}

// 校验回包内容是否有逻辑错误

err = core.CheckResponse(response)

if err != nil{

log.Printf("check response err:%s",err)

return

}

// 读取回包信息

body, err := ioutil.ReadAll(response.Body)

if err != nil{

log.Printf("read response body err:%s",err)

return

}

fmt.Println(string(body))

}

注意:

• 账单文件的下载地址的有效时间为30s

• 强烈建议商户将实际账单文件的哈希值和之前从接口获取到的哈希值进行比对,以确认数据的完整性

更多参数、响应详情及错误码请参见 JSAPI / APP / H5 / Native / 小程序下载账单API接口文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值