Skip to main content

Native 支付

提示
  1. 本文档均以提前注册的子商户用法为例。
  2. Native 支付无需绑定应用,因为是生成二维码,谁都可以扫。
  3. 需要开通 Native 支付,登录特约商户的商户平台,在授权产品哪里查看是否已授权即可,如下所示:

Native支付授权

下单

方法定义:

/**
* Native 下单接口
* @description 该方法对接[官方文档](https://pay.weixin.qq.com/docs/partner/apis/partner-native-payment/partner-jsons/partner-native-prepay.html)
* @param params Native支付下单参数
* @param subMerchantInfo 特约商户应用配置
* @returns Native下单结果
*/
async placeOrder(
params: WechatProviderPayPlaceOrderNativeParams,
subMerchantInfo?: WechatProviderSubMerchantInfo
): Promise<WechatProviderPayPlaceOrderNativeResponse> {}

使用示例:

const { success, data, error } = await this.wechatProviderPayNativeService.placeOrder({
out_trade_no: order.tradeNo,
description: 'xxx',
notify_url: this.payConfig.wechatProvider.notifyUrlPrefix + '/wechat/pay/provider',
amount: {
total: order.price
}
});
提示

上述下单方法,可是与应用和下单人无关哦,当然也可以加上应用信息(sub_appid),感觉上加上应用信息后需要建立应用和商户的绑定关系,就像小程序那样,不过不加应用信息一样使用,建议不要画蛇添足了。

返回的 data 类型定义如下:

interface WechatProviderPayPlaceOrderNativeResponseData {
/**
* 付款二维码链接
* @description 此URL用于生成支付二维码,然后提供给用户扫码支付。**注意**:`code_url`并非固定值,使用时按照URL格式转成二维码即可。
*/
code_url: string;
}

前端只需要用code_url字段来生成二维码即可!

展开查看传入参数params类型定义
/** 单品列表类型 */
interface DetailGoodDetail {
/**
* 商户侧商品编码
* @description 由半角的大小写字母、数字、中划线、下划线中的一种或几种组成。
* @exports 商品编码
*/
merchant_goods_id: string;
/**
* 商品数量
* @description 用户购买的数量
* @example 1
*/
quantity: number;
/**
* 商品单价
* @description 商品单价,单位为分
* @example 828800
*/
unit_price: number;
/**
* 微信侧商品编码
* @description 微信支付定义的统一商品编号(没有可不传)
* @example 1001
*/
wechatpay_goods_id?: string;
/**
* 商品名称
* @description 商品的实际名称
* @example iPhoneX 256G
*/
goods_name?: string;
}

/** 优惠功能类型 */
interface Detail {
/**
* 订单原价
* @description 1、商户侧一张小票订单可能被分多次支付,订单原价用于记录整张小票的交易金额。
* @description 2、当订单原价与支付金额不相等,则不享受优惠。
* @description 3、该字段主要用于防止同一张小票分多次支付,以享受多次优惠的情况,正常支付订单不必上传此参数。
* @example 608800
*/
cost_price?: number;
/**
* 商家小票ID
* @example 微信123
*/
invoice_id?: number;
/**
* 单品列表
* @description 条目个数限制:1-6000
*/
goods_detail?: DetailGoodDetail[];
}

/** 商户门店信息类型 */
interface SceneInfoStoreInfo {
/**
* 门店编号
* @description 商户侧门店编号
* @example 0001
*/
id: string;
/**
* 门店名称
* @description 商户侧门店名称
* @example 腾讯大厦分店
*/
name?: string;
/**
* 地区编码
* @see https://pay.weixin.qq.com/wiki/doc/apiv3/terms_definition/chapter1_1_3.shtml#part-5
* @example 440305
*/
area_code?: string;
/**
* 详细地址
* @description 详细的商户门店地址
* @example 广东省深圳市南山区科技中一道10000号
*/
address?: string;
}

/** 支付场景描述 */
interface SceneInfo {
/**
* 用户终端IP
* @description 用户的客户端IP,支持IPv4和IPv6两种格式的IP地址。
* @example 14.23.150.211
*/
payer_client_ip: string;
/**
* 商户端设备号
* @description 商户端设备号(门店号或收银设备ID)
* @example 013467007045764
*/
device_id?: string;
/** 商户门店信息 */
store_info?: SceneInfoStoreInfo;
}

/**
* Native 下单请求参数(微信服务商支付)
* @author 张冰 2024-01-31
*/
export interface WechatProviderPayPlaceOrderNativeParams {
/**
* 商品描述
* @example Image形象店-深圳腾大-QQ公仔
*/
description: string;
/**
* 商户订单号
* @description 商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一
* @example 1217752501201407033233368018
*/
out_trade_no: string;
/**
* 通知地址
* @description 通知URL必须为直接可访问的URL,不允许携带查询串,要求必须为https地址。
* @exports https://www.weixin.qq.com/wxpay/pay.php
*/
notify_url: string;
/** 订单金额信息 */
amount: {
/**
* 总金额
* @description 订单总金额,单位为分。
* @example 100
*/
total: number;
/**
* 货币类型
* @description 境内商户号仅支持人民币。
* @example CNY
*/
currency?: string | 'CNY';
};
/**
* 交易结束时间
* @description 该字段传入的是JS的时间,最终发送给微信支付服务器会自动转换为[rfc3339](https://datatracker.ietf.org/doc/html/rfc3339)时间格式,开发者无需手动转换
*/
time_expire?: Date;
/**
* 附加数据
* @description 附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用
*/
attach?: string;
/**
* 电子发票入口开放标识
* @description 传入true时,支付成功消息和支付详情页将出现开票入口。需要在微信支付商户平台或微信公众平台开通电子发票功能,传此字段才可生效。
*/
support_fapiao?: boolean;
/**
* 订单优惠标记
* @example WXG
*/
goods_tag?: string;
/** 优惠功能 */
detail?: Detail;
/**
* 场景信息
* @description 支付场景描述
*/
scene_info?: SceneInfo;
/** 结算信息 */
settle_info?: {
/**
* 是否指定分账
* @example false
*/
profit_sharing?: boolean;
};
}
参数提示
  1. 相比于JSAPI支付,不需要再传入payer支付者信息)字段了。
  2. 增加了support_fapiao电子发票入口开放标识)字段,非必传