### Q:小程序支付如何实现多商家收款? A:详情可查看 [小程序支付如何实现多商家收款](https://ideservice.alipay.com/cms/site/01rb0i)。 ### Q:**JSAPI支付提示额度为 0 元?或提示收款额度受限?** A:开通 JSAPI 支付时,若小程序未上架,收款额度将受到限制(单笔收款<=2000 元,单日收款<=20000 元),商家可通过完善开通页面对应信息解除限制,详情可查看 [如何进行支付产品资质补全以提升额度](https://ideservice.alipay.com/cms/site/06fioz?pathHash=6443a545)。 ### Q:**JSAPI支付 开通审核时效?** A:提交开通或补齐资料申请后 1 个工作日内返回审核结果。 ### Q:“当面付”和“JSAPI支付”有什么区别? A:**当面付** 是一款可以在多个场景收款的产品,**JSAPI支付** 是专门用于小程序场景收款的产品,两者关系如下: ![图片常见问题.jpg](https://cdn.nlark.com/yuque/0/2023/jpeg/179989/1686794942519-f217116b-16ba-441a-b03a-d6540272004e.jpeg#__spacing=both&height=340&id=OfuxV&originHeight=1206&originWidth=3195&originalType=binary&ratio=1&rotation=0&showTitle=false&size=229767&status=done&style=stroke&title=&width=900) ### Q:我的小程序已接入过当面付,如何快速切换到JSAPI支付? A:小程序场景中,**JSAPI支付** 使用的接口,和当面付使用的接口一样,区别在于两点: - 区别一:**JSAPI支付** 使用的产品码不一样,需要注意更换 product_code 的参数,从 FACE_TO_FACE_PAYMENT 变更为 JSAPI_PAY。 - 区别二:**JSAPI支付** 增加了一个必传字段,op_app_id。该字段指商户在小程序中,拉起收银台支付时的小程序应用的 APPID。开通 **JSAPI支付** 产品后,需在 **商家平台** > **产品中心** > **支付产品** >[JSAPI支付 产品详情页面](https://b.alipay.com/page/product-mall/product-detail/I1080300001000060370) 关联对应的小程序 APPID,否则下单会失败。 - 区别三:当商家需要在 [商家平台](http://b.alipay.com) > **数据中心**(入口1:**数据中心 **>** 交易中心 **>** 小程序交易**;入口2:**数据中心 **> **小程序分析 **>** 交易**)中查看对应业务场景下的数据明细时,可以通过 business_params 对象的 tiny_app_merchant_biz_type 指定业务场景值,支持传入的值详见:[小程序细分业务场景](https://ideservice.alipay.com/cms/site/08by8k?pathHash=96e03412)。 **注意**:请勿修改 **当面付 **产品的其它接口,仅需修改 alipay.trade.create(统一收单交易创建接口),即可升级为 **JSAPI支付**。 | **序号** | **接入流程** | **使用的接口** | **当面付** | **JSAPI支付** | | --- | --- | --- | --- | --- | | 1 | 发送订单信息 | [my.request](https://ideservice.alipay.com/cms/site/039t0k) | - | 无变化 | | 2 | 创建交易订单 | alipay.trade.create(统一收单交易创建接口) | product_code:FACE_TO_FACE_PAYMENT |
- product_code:JSAPI_PAY
- 新增字段:op_app_id(小程序支付中,商户实际经营主体的小程序应用的 APPID,指在小程序中,拉起收银台支付时的小程序应用的 APPID)
| | 3 | 唤起收银台支付 | my.tradePay(发起支付) | 无限制 | 必须调用 my.tradePay(发起支付)接口才能唤起收银台 | | 4 | 异步通知 | 在 alipay.trade.create(统一收单交易创建接口) 设置异步通知(notify_url) | - | 无变化 | | 5 | 交易辅助(查询、退款、撤销、关闭) | alipay.trade.query(统一收单交易查询接口)
alipay.trade.refund(统一收单交易退款接口)
alipay.trade.cancel(统一收单交易撤销接口)
alipay.trade.close(统一收单交易关闭接口) | - | 无变化 | ### Q:在 IDE 上调用 my.tradePay 报错 “error2: 无效的 API 入参”,如何处理? A:目前 IDE 模拟器调用 my.tradePay 后会生成一个支付二维码(有效时间 10 分钟),开发者在支付宝客户端扫码支付,支付结果会同步 my.tradePay 回调。 ![image.png](https://cdn.nlark.com/yuque/0/2023/png/179989/1685101461299-058d0fcf-002e-4066-b56c-47b4ae56985e.png#__spacing=both&height=323&id=d3fo5&originHeight=646&originWidth=1624&originalType=binary&ratio=1&rotation=0&showTitle=false&size=769687&status=done&style=none&title=&width=812) ### Q:小程序支付无法调起支付,如何处理? A:
**可能原因** - 服务端回传的 tradeNO 出错,导致传入 my.tradePay 的 tradeNO 参数错误。 - 小程序支付无法在 IDE 模拟器中进行测试。 **解决方案** 1. 在服务端调用 alipay.trade.create(统一收单交易创建接口),获得支付宝交易号 tradeNO(以 Java 代码为例)。 ```java package com.java.sdk.demo; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.AlipayConfig; import com.alipay.api.response.AlipayTradeCreateResponse; import com.alipay.api.domain.SignParams; import com.alipay.api.domain.PeriodRuleParams; import com.alipay.api.domain.ReceiverAddressInfo; import com.alipay.api.domain.AccessParams; import com.alipay.api.request.AlipayTradeCreateRequest; import com.alipay.api.domain.SignMerchantParams; import com.alipay.api.domain.SettleInfo; import com.alipay.api.domain.LogisticsDetail; import com.alipay.api.domain.ExtendParams; import com.alipay.api.domain.GoodsDetail; import com.alipay.api.domain.BusinessParams; import com.alipay.api.domain.SceneRuleParams; import com.alipay.api.domain.OpenApiSpecifiedChannelParamsPojo; import com.alipay.api.domain.SettleDetailInfo; import com.alipay.api.domain.AlipayTradeCreateModel; import com.alipay.api.domain.BkAgentReqInfo; import com.alipay.api.FileItem; import java.util.Base64; import java.util.ArrayList; import java.util.List; public class AlipayTradeCreate { public static void main(String[] args) throws AlipayApiException { // 初始化SDK AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig()); // 构造请求参数以调用接口 AlipayTradeCreateRequest request = new AlipayTradeCreateRequest(); AlipayTradeCreateModel model = new AlipayTradeCreateModel(); // 设置商户订单号 model.setOutTradeNo("20150320010101001"); // 设置订单总金额 model.setTotalAmount("88.88"); // 设置订单标题 model.setSubject("Iphone6 16G"); // 设置产品码 model.setProductCode("FACE_TO_FACE_PAYMENT"); // 设置卖家支付宝用户ID model.setSellerId("2088102146225135"); // uid参数未来计划废弃,存量商户可继续使用,新商户请使用openid。请根据应用-开发配置-openid配置选择支持的字段。 // model.setBuyerId("2088102146225135"); // 设置买家支付宝用户唯一标识 model.setBuyerOpenId("074a1CcTG1LelxKe4xQC0zgNdId0nxi95b5lsNpazWYoCo5"); // 设置小程序支付中 model.setOpAppId("2014072300007148"); // 设置订单附加信息 model.setBody("Iphone6 16G"); // 设置订单包含的商品列表信息 List goodsDetail = new ArrayList(); GoodsDetail goodsDetail0 = new GoodsDetail(); goodsDetail0.setOutSkuId("outSku_01"); goodsDetail0.setGoodsName("ipad"); goodsDetail0.setQuantity(1L); goodsDetail0.setPrice("2000"); goodsDetail0.setOutItemId("outItem_01"); goodsDetail0.setGoodsId("apple-01"); goodsDetail0.setGoodsCategory("34543238"); goodsDetail0.setCategoriesTree("124868003|126232002|126252004"); goodsDetail0.setShowUrl("http://www.alipay.com/xxx.jpg"); goodsDetail.add(goodsDetail0); model.setGoodsDetail(goodsDetail); // 设置订单绝对超时时间 model.setTimeExpire("2021-12-31 10:05:00"); // 设置订单相对超时时间 model.setTimeoutExpress("90m"); // 设置描述结算信息 SettleInfo settleInfo = new SettleInfo(); settleInfo.setSettlePeriodTime("7d"); List settleDetailInfos = new ArrayList(); SettleDetailInfo settleDetailInfos0 = new SettleDetailInfo(); settleDetailInfos0.setAmount("0.1"); settleDetailInfos0.setTransIn("A0001"); settleDetailInfos0.setSettleEntityType("SecondMerchant"); settleDetailInfos0.setSummaryDimension("A0001"); settleDetailInfos0.setActualAmount("0.1"); settleDetailInfos0.setSettleEntityId("2088xxxxx;ST_0001"); settleDetailInfos0.setTransInType("cardAliasNo"); settleDetailInfos.add(settleDetailInfos0); settleInfo.setSettleDetailInfos(settleDetailInfos); model.setSettleInfo(settleInfo); // 设置业务扩展参数 ExtendParams extendParams = new ExtendParams(); extendParams.setSysServiceProviderId("2088511833207846"); extendParams.setTcInstallmentOrderId("2015042321001004720200028594"); extendParams.setSpecifiedSellerName("XXX的跨境小铺"); extendParams.setRoyaltyFreeze("true"); extendParams.setCardType("S0JP0000"); extendParams.setCreditExtInfo("{\"category\":\"CHARGE_PILE_CAR\",\"serviceId\":\"2020042800000000000001450466\"}"); extendParams.setTradeComponentOrderId("2023060801502300000008810000005657"); model.setExtendParams(extendParams); // 设置商户传入业务信息 BusinessParams businessParams = new BusinessParams(); businessParams.setGoodTaxes("10.00"); businessParams.setEnterprisePayInfo("{\"category_list\":[{\"price\":\"10.24\",\"name\":\"餐饮服务\",\"category\":\"3070401000000000000\"}]}"); businessParams.setActualOrderTime("2019-05-14 09:18:55"); businessParams.setPriorityUnfreezeAsset("CREDIT_ASSET"); businessParams.setCampusCard("0000306634"); businessParams.setCardType("T0HK0000"); businessParams.setEnterprisePayAmount("10.00"); businessParams.setTinyAppMerchantBizType("KX_SHOPPING"); businessParams.setMcCreateTradeIp("127.0.0.1"); model.setBusinessParams(businessParams); // 设置可打折金额 model.setDiscountableAmount("80.00"); // 设置不可打折金额 model.setUndiscountableAmount("8.88"); // 设置商户门店编号 model.setStoreId("NJ_001"); // 设置商户操作员编号 model.setOperatorId("Yx_001"); // 设置商户机具终端编号 model.setTerminalId("NJ_T_001"); // 设置物流信息 LogisticsDetail logisticsDetail = new LogisticsDetail(); logisticsDetail.setLogisticsType("EXPRESS"); model.setLogisticsDetail(logisticsDetail); // 设置收货人及地址信息 ReceiverAddressInfo receiverAddressInfo = new ReceiverAddressInfo(); receiverAddressInfo.setZip("200120"); receiverAddressInfo.setAddress("上海市浦东新区陆家嘴银城中路501号"); receiverAddressInfo.setName("张三"); receiverAddressInfo.setMobile("13120180615"); receiverAddressInfo.setDivisionCode("310115"); model.setReceiverAddressInfo(receiverAddressInfo); // 设置返回参数选项 List queryOptions = new ArrayList(); queryOptions.add("enterprise_pay_info"); queryOptions.add("hyb_amount"); model.setQueryOptions(queryOptions); // 设置间联交易下 BkAgentReqInfo bkagentReqInfo = new BkAgentReqInfo(); bkagentReqInfo.setMerchCode("123412341234"); bkagentReqInfo.setAcqCode("12345678901234"); bkagentReqInfo.setDeviceType("02"); bkagentReqInfo.setLocation("+37.28/-121.268"); bkagentReqInfo.setSerialNum("123123123123"); model.setBkagentReqInfo(bkagentReqInfo); // 设置签约参数 SignParams agreementSignParams = new SignParams(); SignMerchantParams subMerchant = new SignMerchantParams(); subMerchant.setSubMerchantName("滴滴出行"); subMerchant.setSubMerchantServiceName("滴滴出行免密支付"); subMerchant.setSubMerchantServiceDescription("免密付车费,单次最高500"); subMerchant.setSubMerchantId("2088123412341234"); agreementSignParams.setSubMerchant(subMerchant); AccessParams accessParams = new AccessParams(); accessParams.setChannel("ALIPAYAPP"); agreementSignParams.setAccessParams(accessParams); PeriodRuleParams periodRuleParams = new PeriodRuleParams(); periodRuleParams.setPeriod(3L); periodRuleParams.setTotalAmount("600.00"); periodRuleParams.setExecuteTime("2019-01-23"); periodRuleParams.setSingleAmount("10.99"); periodRuleParams.setTotalPayments(12L); SceneRuleParams sceneRuleParams = new SceneRuleParams(); sceneRuleParams.setDiscountPeriod("1"); sceneRuleParams.setLowPricePeriod("2"); periodRuleParams.setSceneRuleParams(sceneRuleParams); periodRuleParams.setPeriodType("DAY"); agreementSignParams.setPeriodRuleParams(periodRuleParams); agreementSignParams.setSignNotifyUrl("http://www.merchant.com/receiveSignNotify"); List recommendSortChannelParams = new ArrayList(); OpenApiSpecifiedChannelParamsPojo recommendSortChannelParams0 = new OpenApiSpecifiedChannelParamsPojo(); recommendSortChannelParams0.setAssetTypeCode("ALICREDIT"); recommendSortChannelParams0.setInstId("INST_ALIPAY"); recommendSortChannelParams.add(recommendSortChannelParams0); agreementSignParams.setRecommendSortChannelParams(recommendSortChannelParams); agreementSignParams.setExternalLogonId("13888888888"); agreementSignParams.setPersonalProductCode("CYCLE_PAY_AUTH_P"); agreementSignParams.setExternalAgreementNo("test20190701"); agreementSignParams.setProductCode("GENERAL_WITHHOLDING"); agreementSignParams.setAllowHuazhiDegrade(false); agreementSignParams.setSignScene("INDUSTRY|DIGITAL_MEDIA"); agreementSignParams.setEffectTime("600"); model.setAgreementSignParams(agreementSignParams); // 设置买家支付宝用户唯一标识(商户实际经营主体的小程序应用关联的买家open_id) model.setOpBuyerOpenId("074a1CcTG1LelxKe4xQC0zgNdId0nxi95b5lsNpazWYoCo5"); request.setBizModel(model); // 第三方代调用模式下请设置app_auth_token // request.putOtherTextParam("app_auth_token", "<-- 请填写应用授权令牌 -->"); AlipayTradeCreateResponse response = alipayClient.execute(request); System.out.println(response.getBody()); if (response.isSuccess()) { System.out.println("调用成功"); } else { System.out.println("调用失败"); // sdk版本是"4.38.0.ALL"及以上,可以参考下面的示例获取诊断链接 // String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response); // System.out.println(diagnosisUrl); } } private static AlipayConfig getAlipayConfig() { String privateKey = "<-- 请填写您的应用私钥,例如:MIIEvQIBADANB ... ... -->"; String alipayPublicKey = "<-- 请填写您的支付宝公钥,例如:MIIBIjANBg... -->"; AlipayConfig alipayConfig = new AlipayConfig(); alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do"); alipayConfig.setAppId("<-- 请填写您的AppId,例如:2019091767145019 -->"); alipayConfig.setPrivateKey(privateKey); alipayConfig.setFormat("json"); alipayConfig.setAlipayPublicKey(alipayPublicKey); alipayConfig.setCharset("UTF-8"); alipayConfig.setSignType("RSA2"); return alipayConfig; } } ``` ### Q:**拉起收银台报错“指定小程序主体未完成关联绑定”,如何处理?** A:需要前往前往:商家平台 → 产品管理 → JSAPI支付 → 关联绑定 将该小程序与JSAPI支付产品相绑定。