PandaPay Open Platform

PandaPay 开放平台接入文档

本文档提供线上支付、退款接入说明与接口签名规则。商户完成开户进件并开通对应 API 权限后,可按本文档发起支付、退款及查询请求,并校验结果通知签名。

生产支付域名 https://pay.chengzhangtong.com

接入指引

禁止接入

禁止接入的内容包括但不限于以下内容。我们对违规行为零容忍,一经发现将关闭支付接口权限,关联商户清退,并视违规情况报警处理。

诈骗、BC、赛车、V 盘、X 资金盘、贷款、P2P、汇兑、ICO、二清支付、金融类严禁接入。

1 元购类、高额返利类、多级分销类、盲盒类、单纯形式抽奖类、发卡平台严禁接入。

恋爱话术类、数字藏品、色情、政治相关、影视小说、电子书、游戏平台严禁接入。

付费入群、帐号销售、刷单、卡盟平台、刷粉、VPN、售卖假货严禁接入。

微信/支付宝官方要求禁止接入的、所有国家法规规定禁止的内容严禁接入。

其它经工作人员鉴定不适合接入的业务严禁接入。

违规处理

以上内容严禁接入。一经发现,将关闭支付接口权限,关联商户清退,并视违规情况报警处理。

微信官方禁止接入行业:http://kf.qq.com/faq/140225MveaUz150123raQRNN.html

支付宝官方禁止接入行业:https://cshall.alipay.com/enterprise/knowledgeDetail.htm?knowledgeId=201602055422

我们欢迎 SaaS 软件、各行业解决方案服务商入驻平台,并提供一对一的技术对接支持。

接入指引

注册开户

商户注册后即可登录商户系统,并根据业务需要完成进件、认证和接口权限开通。

商户注册地址

https://mch.chengzhangtong.com/register,使用邀请码:。

注册成功后,请登录商户系统继续完成资料提交和后续支付通道开通流程。

接入指引

开通支付通道

商户开通支付通道,一般需要完成与支付公司的合同签约、微信认证、支付宝认证。具体材料、审核流程和通道能力,以每个支付渠道的要求为准。

第一步:完成渠道签约

根据业务场景选择合适的支付渠道,并按渠道要求提交主体资料、结算账户、经营信息、门店或线上场景信息。审核通过后,商户可获得对应支付通道的交易能力。

第二步:开通接口

进件成功后,请联系代理商或计全运营人员,开通支付接口权限。开通接口通常会产生商户接入费,具体费用以商务或运营确认结果为准。

支付接口对接:https://mch.chengzhangtong.com/register

推荐支付渠道

盛付通

开通需联系客服。默认开通 D1 到账,适合线下场景,尤其是非异地交易。

  • 进件审核快,一般 5 分钟内显示审核结果。
  • 支持小微、个体、企业进件。
  • 可结算到对私账户,也支持非法人对私结算。

易宝支付

开通需联系客服。默认开通 D1 到账,可设置自助结算。

  • 进件审核快,一般 5 分钟内显示审核结果。
  • 支持个体、企业进件,可进微信线上通道,费率相对较高。
  • 支持高比例分账,可分账给小微、个体、企业。
微信渠道号

对于部分平台,如需开通微信渠道号,请单独联系运营开通。开通渠道号后,可统一使用平台小程序为商户提供支付接入能力。

接入指引

线上支付说明

如商户有线上支付需求,请在开户进件完成后联系运营或商务开通 API 接口权限。正式使用前,网站、App、小程序等业务载体需满足平台合规要求。

接口域名

支付相关页面、收银台链接、跳转链接和接口回调中涉及支付网关时,统一使用 https://pay.chengzhangtong.com。该域名根路径不提供页面,浏览器直接打开返回 404 属于正常现象;业务接口需按文档路径发起 POST 请求。

统一下单接口

接口地址POST https://pay.chengzhangtong.com/api/pay/unifiedOrder
内容类型application/json; charset=UTF-8
签名方式MD5
金额单位分。例如 1 元传 100,0.01 元传 1。

基础请求参数

字段说明
mchNoPandaPay 分配的平台商户号。
appIdPandaPay 分配的应用 AppID。
mchOrderNo商户系统订单号,同一商户下不可重复。
wayCode支付方式编码,例如 WX_H5、ALI_WAP、WEB_CASHIER。
amount订单金额,单位为分。
currency币种,固定传 CNY 或 cny。
clientIp用户真实 IP,H5/风控场景必须准确传入。
subject商品标题。
body商品描述。
notifyUrl支付结果异步通知地址,生产交易建议必传。
returnUrl用户支付完成后的前端跳转地址。
reqTime请求时间戳,推荐 13 位毫秒时间戳。
version接口版本,当前传 1.0。
signType签名类型,当前传 MD5。
sign按签名规则生成的签名值。

统一收银台

统一下单时传入 wayCode = WEB_CASHIER,接口会返回 Web 统一收银台地址。用户打开后,系统会根据访问终端展示适配的支付方式。

打开场景支持方式
PC 端聚合码、微信扫码、支付宝 PC 支付
手机 H5微信 H5、支付宝 H5、微信小程序、支付宝小程序、支付宝生活号
微信客户端微信公众号支付
支付宝客户端支付宝生活号支付

聚合码支付

统一下单时传入 wayCode = QR_CASHIER,接口返回二维码地址,用户扫码后完成支付。默认 channelExtra 为空时按 JSAPI 场景处理;如需小程序包装,可传入对应入口参数。

移动 App 支付

原生 App 可使用 WX_APP 或 ALI_APP 获取调起微信、支付宝 SDK 所需参数。推荐方案是使用 QR_CASHIER 并在 channelExtra 中传入小程序包装参数。

{
  "entryLiteType": "wxapp"
}

返回的 payData 中会包含小程序跳转所需字段,例如:

{
  "path": "pages/hub/lite",
  "qrUrl": "https://pay.chengzhangtong.com/cashier/pages/hub/h5/?jeepayToken=示例token",
  "ghid": "gh_xxxxxxxxxxxx",
  "env": "release"
}

公众号或小程序支付

商户使用自有公众号或小程序支付时,可在统一下单中传 wayCode = WX_JSAPI 或 wayCode = WX_LITE,并在 channelExtra 中带上 subAppId 与 openid。

{
  "subAppId": "wx08b5a41f7a27abf1",
  "openid": "o6BcIwvSiRpfS8e_UyfQNrYuk2LI"
}

如采用服务商小程序承载支付,可使用 QR_CASHIER 并按返回的 payData 跳转。跳转 URL 统一使用 pay.htdata.us 域名。

微信 H5 支付

手机浏览器中可传 wayCode = WX_H5 获取微信 H5 支付链接。推荐方式是使用 QR_CASHIER 并设置 entryLiteType = wxh5,返回的 payData 为可打开的支付链接。

支付宝 H5 支付

手机浏览器中可传 wayCode = ALI_WAP 获取支付宝 H5 支付链接。也可使用小程序包装方式:QR_CASHIER + entryLiteType = alih5。

{
  "code": 0,
  "data": {
    "mchOrderNo": "mho1685287074463",
    "orderState": 0,
    "payData": "alipays://platformapi/startapp?appId=示例appId&page=pages/hub/lite&query=qrCode=https://pay.chengzhangtong.com/cashier/pages/hub/h5/?jeepayToken=示例token",
    "payDataType": "payurl",
    "payOrderId": "P1662840631865769986"
  },
  "msg": "SUCCESS",
  "sign": "示例签名"
}

接口文档

有赞通道接入

接入原则

客户系统只对接 PandaPay 开放平台,不需要也不应该直接请求有赞或高汇通接口。有赞服务商商户号、二级商户号、证书、公私钥和通道参数由 PandaPay 后台配置并维护。

已验证可拉起方式

客户传入PandaPay 通道处理返回拉起字段
wayCode = WX_H5有赞通道下发公共微信小程序收银台能力。payDataType = payurl,payData 为 https://wxmpurl.cn/... 链接。
wayCode = ALI_WAP有赞通道下发支付宝收银台能力。payDataType = payurl,payData 为 https://cashier.youzan.com/pay/buyer/open... 链接。
wayCode = WEB_CASHIERPandaPay Web 收银台,由用户选择支付方式。payData 为 PandaPay 收银台 URL。
wayCode = QR_CASHIERPandaPay 聚合收银台或小程序包装入口。payData 返回二维码或包装跳转信息。

微信示例

{
  "mchNo": "平台商户号",
  "appId": "平台应用AppID",
  "mchOrderNo": "PAYOUT202608260001",
  "wayCode": "WX_H5",
  "amount": 100,
  "currency": "CNY",
  "clientIp": "用户真实IP",
  "subject": "测试商品",
  "body": "测试商品",
  "notifyUrl": "https://example.com/pay/notify",
  "returnUrl": "https://example.com/pay/return",
  "reqTime": "1787635459102",
  "version": "1.0",
  "signType": "MD5",
  "sign": "按商户key生成的签名"
}

支付宝示例

{
  "mchNo": "平台商户号",
  "appId": "平台应用AppID",
  "mchOrderNo": "PAYOUT202608260002",
  "wayCode": "ALI_WAP",
  "amount": 100,
  "currency": "CNY",
  "clientIp": "用户真实IP",
  "subject": "测试商品",
  "body": "测试商品",
  "notifyUrl": "https://example.com/pay/notify",
  "returnUrl": "https://example.com/pay/return",
  "reqTime": "1787635459102",
  "version": "1.0",
  "signType": "MD5",
  "channelExtra": {
    "payDataType": "payUrl"
  },
  "sign": "按商户key生成的签名"
}

成功返回示例

{
  "code": 0,
  "data": {
    "mchOrderNo": "PAYOUT202608260001",
    "orderState": 1,
    "payData": "https://wxmpurl.cn/示例链接",
    "payDataType": "payurl",
    "payOrderId": "P209xxxxxxxxxxxx"
  },
  "msg": "SUCCESS",
  "sign": "响应签名"
}

返回 code = 0 且 msg = SUCCESS 只表示下单请求成功,不代表用户已经付款。请以异步回调或订单查询中的支付成功状态为准。

接口文档

退款接口

客户系统统一调用 PandaPay 申请及查询退款,不直接请求有赞或其他渠道。退款沿原支付订单的渠道处理,不需要重新传入支付方式或渠道编号;需先开通商户 API 退款权限,且原订单已支付成功、存在可退余额。

本节描述当前线上商户接口。下列订单号、时间戳、签名与通知地址均为示意,接入时请替换并重新签名;示例不代表真实退款或到账凭证。

公共请求参数

字段必填说明
mchNo是平台商户号,最长64字符。
appId是该商户原支付订单所属的应用AppID,最长64字符。
reqTime是请求时间戳字符串;请求时生成当前13位毫秒时间戳。
version是接口版本,传 1.0。
signType是按当前接入方式传 MD5。
sign是使用该应用的商户key,按签名规则生成。

退款申请

项目说明
接口地址POST https://pay.chengzhangtong.com/api/refund/refundOrder
内容类型application/json; charset=UTF-8
金额单位整数,单位为分;例如原支付100分,退20分,传 refundAmount = 20。
业务字段必填说明
payOrderId二选一平台原支付订单号,最长30字符;与 mchOrderNo 至少传一个,建议选一种明确的查询条件。
mchOrderNo二选一商户原支付订单号,最长64字符,不是商户退款单号。
mchRefundNo是商户退款单号,最长64字符;同一商户内唯一,一次退款申请对应一个编号。
refundAmount是本次退款金额,整数分,至少1分,不能超过原订单剩余可退金额。
currency是与原交易币种保持一致,人民币使用 CNY。
refundReason是退款原因,最长256字符。
clientIp否用户真实IP,最长128字符。
notifyUrl否本次退款的异步通知地址,最长128字符,支持HTTP或HTTPS,生产建议HTTPS;不自动沿用支付申请的通知地址。若后台已配置商户统一退款通知地址,线上系统优先使用该配置。
extParam否商户扩展参数,最长512字符,可在退款查询或通知中返回。
channelExtra否渠道附加参数,最长512字符的JSON字符串;仅在对应渠道已明确要求时传入,不自行拼造。

申请示例

{
  "mchNo": "平台商户号",
  "appId": "原支付订单所属应用AppID",
  "payOrderId": "P平台支付订单号",
  "mchRefundNo": "REFUND202610210001",
  "refundAmount": 20,
  "currency": "CNY",
  "refundReason": "客户申请部分退款",
  "clientIp": "用户真实IP",
  "notifyUrl": "https://example.com/refund/notify",
  "extParam": "商户自定义关联信息",
  "reqTime": "请求时生成的13位毫秒时间戳",
  "version": "1.0",
  "signType": "MD5",
  "sign": "按商户key生成的签名"
}

受理返回示例

{
  "code": 0,
  "data": {
    "refundOrderId": "R平台退款订单号",
    "mchRefundNo": "REFUND202610210001",
    "payAmount": 100,
    "refundAmount": 20,
    "state": 1
  },
  "msg": "SUCCESS",
  "sign": "响应签名"
}
受理成功不等于退款成功

code = 0、msg = SUCCESS 只表示本次接口调用成功。必须继续检查 data.state;上例 state = 1 表示退款中。即时成功也可能返回 state = 2,不能把所有正常响应都当成已退款。

申请响应字段

字段说明
refundOrderId平台退款订单号。
mchRefundNo商户退款单号。
payAmount原支付金额,单位为分。
refundAmount本次退款金额,单位为分。
state退款状态,见下方状态表。
channelOrderNo渠道退款单号,渠道返回后才可能有值;与原支付的渠道交易号不同。
errCode / errMsg渠道错误码及说明,存在错误时按实际响应排查;字段可能为空或省略。

退款查询

接口地址:POST https://pay.chengzhangtong.com/api/refund/query,内容类型与公共签名参数同退款申请。该接口返回 PandaPay 已保存的退款结果,并不等同于每次请求都会实时调用上游渠道查单。结果仍在处理中时,应等待状态更新或联系平台核对。

查询字段必填说明
mchRefundNo二选一商户退款单号,最长64字符。
refundOrderId二选一平台退款订单号,最长30字符。两者至少传一个;使用原退款单标识,不另造新号。

查询示例

{
  "mchNo": "平台商户号",
  "appId": "原支付订单所属应用AppID",
  "mchRefundNo": "REFUND202610210001",
  "reqTime": "请求时生成的13位毫秒时间戳",
  "version": "1.0",
  "signType": "MD5",
  "sign": "按商户key生成的签名"
}

退款成功的查询返回示例

{
  "code": 0,
  "data": {
    "refundOrderId": "R平台退款订单号",
    "payOrderId": "P平台支付订单号",
    "mchNo": "平台商户号",
    "appId": "原支付订单所属应用AppID",
    "mchRefundNo": "REFUND202610210001",
    "payAmount": 100,
    "refundAmount": 20,
    "currency": "CNY",
    "state": 2,
    "channelOrderNo": "渠道退款单号",
    "extParam": "商户自定义关联信息",
    "successTime": 1792573200000,
    "createdAt": 1792573140000
  },
  "msg": "SUCCESS",
  "sign": "响应签名"
}

查询返回包含申请响应中的状态、金额、渠道退款号及错误字段,并增加 payOrderId、mchNo、appId、currency、extParam、successTime 和 createdAt。时间为毫秒时间戳;successTime 在尚未成功时可能为空或省略。

退款状态

state含义商户处理建议
0订单生成已生成本地退款单,尚不能确认退款完成;继续核对原退款。
1退款中等待结果,不因等待或超时而重复申请。
2退款成功验签并核对订单、商户和金额后,按该退款单完成业务处理。
3退款失败查看错误说明并核对原因;是否再次申请应人工确认,不能自动换号重退。
4退款任务关闭表示平台退款任务已关闭,不等于渠道一定未退款;先联系平台核实上游最终结果。

退款结果通知

平台产生退款结果通知时,向退款单生效的通知地址发起 POST。是否发送受商户退款通知开关、通知地址及处理结果影响;不能把“未收到通知”判断为退款未发生,也不能保证所有错误都会另发通知。

通知内容使用退款查询结果字段,并增加 reqTime 与 sign;通知中的 state 才是该次退款业务状态。实际报文承载格式以商户后台通知类型配置为准:

通知配置参数读取位置
表单POST(默认)application/x-www-form-urlencoded 请求体。
JSON POSTapplication/json 请求体。
URL参数POST请求仍为POST,业务参数放在通知URL的查询字符串中。

通知参数示例(展示字段,JSON配置时为请求体)

{
  "refundOrderId": "R平台退款订单号",
  "payOrderId": "P平台支付订单号",
  "mchNo": "平台商户号",
  "appId": "原支付订单所属应用AppID",
  "mchRefundNo": "REFUND202610210001",
  "payAmount": 100,
  "refundAmount": 20,
  "currency": "CNY",
  "state": 2,
  "channelOrderNo": "渠道退款单号",
  "extParam": "商户自定义关联信息",
  "successTime": 1792573200000,
  "createdAt": 1792573140000,
  "reqTime": 1792573201000,
  "sign": "退款通知签名"
}
  1. 按照签名规则,使用该应用的商户key校验收到的完整字段集合;不要使用渠道证书或有赞服务商密钥替代。
  2. 核对 mchNo、appId、refundOrderId / mchRefundNo、原支付单和本次退款金额,并以 state 判断结果。
  3. 以退款订单号做幂等处理;重复通知不能重复退款、重复记账或重复给客户增加余额。
  4. 接收并处理成功后,返回HTTP 200,响应体为纯文本 SUCCESS,不要包成JSON或HTML。应答只表示通知接收成功,不代表商户可以忽略通知状态。
SUCCESS

部分退款、重复申请与异常处理

接口文档

支付回调与查询

支付结果回调

客户在统一下单时传入 notifyUrl 后,PandaPay 会在订单支付成功后向该地址发起异步通知。客户收到通知后需要验签,并返回 SUCCESS 表示接收成功。

请求方式POST
通知地址以下单请求中的 notifyUrl 为准。
通知状态后台订单的 notify_state 表示商户通知处理进度。

常见回调字段

{
  "payOrderId": "P209xxxxxxxxxxxx",
  "mchOrderNo": "PAYOUT202608260001",
  "mchNo": "平台商户号",
  "appId": "平台应用AppID",
  "amount": 100,
  "currency": "CNY",
  "state": 2,
  "wayCode": "WX_H5",
  "ifCode": "youzanpay",
  "channelOrderNo": "有赞交易号",
  "successTime": 1787639451000,
  "sign": "通知签名"
}

订单查询接口

接口地址POST https://pay.chengzhangtong.com/api/pay/query
查询条件传 mchNo、appId、mchOrderNo 或 payOrderId,并按 MD5 规则签名。

如客户没有收到异步通知,应先用订单查询接口确认订单最终状态。支付成功但未收到通知时,请检查客户服务器是否能被公网访问、是否返回 SUCCESS、是否拦截了 PandaPay 服务器 IP。

接入排错

常见问题

打开支付网关为什么是 404?

https://pay.chengzhangtong.com 是接口网关,不是网页首页。直接浏览器打开根路径返回 404 正常;统一下单应请求 POST https://pay.chengzhangtong.com/api/pay/unifiedOrder。

GET 统一下单接口为什么是 405?

统一下单接口只接受 POST,浏览器地址栏直接访问属于 GET,会返回 405。

有赞订单为什么 PandaPay 后台看不到?

只有通过 PandaPay 统一下单接口创建的订单才会进入 PandaPay 后台并触发商户回调。直接调用有赞或高汇通接口生成的订单,不会写入 PandaPay 订单表。

支付链接拉不起来怎么办?

请确认使用手机浏览器或对应客户端打开返回的 payData,并确认商户已开通对应通道权限。有赞微信能力当前按公共小程序收银台拉起,不能配置为未开通的 Web 收银台能力。

接口文档

签名规则

协议规则

传输方式HTTP;生产环境建议 HTTPS
提交方式POST 或 GET
内容类型application/json
字符编码UTF-8
签名算法MD5

参数规范

签名生成步骤

  1. 将请求或响应中的非空参数按参数名 ASCII 码从小到大排序。
  2. 按 key=value 格式拼接为 key1=value1&key2=value2 形式的待签名字符串。
  3. 验证返回或通知时,原始 sign 字段不参与待签名字符串拼接。
  4. 在字符串末尾追加 &key=商户私钥。
  5. 对最终字符串做 MD5 运算,并将结果转为大写,得到 sign。
兼容要求

支付中心接口后续可能增加扩展字段。验签时应按收到的完整字段集合参与排序和签名,不能只固定校验既有字段。

Java 示例

Map<String, Object> paramsMap = new HashMap<>();
paramsMap.put("mchNo", "M1682391685");
paramsMap.put("appId", "6447428682ca7458118af79f");
paramsMap.put("mchOrderNo", "mho1694051705945");
paramsMap.put("wayCode", "ALI_BAR");
paramsMap.put("amount", 1L);
paramsMap.put("currency", "CNY");
paramsMap.put("clientIp", "192.166.1.132");
paramsMap.put("subject", "商品标题");
paramsMap.put("body", "商品描述");
paramsMap.put("notifyUrl", "https://example.com/notify");
paramsMap.put("reqTime", "1694051706");
paramsMap.put("version", "1.0");
paramsMap.put("signType", "MD5");
paramsMap.put("channelExtra", "{\"authCode\":\"284957415846666792\"}");

待签名字符串示例

amount=1&appId=6447428682ca7458118af79f&body=商品描述&channelExtra={"authCode":"284957415846666792"}&clientIp=192.166.1.132&currency=CNY&mchNo=M1682391685&mchOrderNo=mho1694051705945&notifyUrl=https://example.com/notify&reqTime=1694051706&signType=MD5&subject=商品标题&version=1.0&wayCode=ALI_BAR&key=商户私钥

最终请求参数示例

{
  "amount": 1,
  "mchOrderNo": "mho1694051705945",
  "subject": "商品标题",
  "wayCode": "ALI_BAR",
  "sign": "924065BA077FA461A9B06D2E76E9ED3C",
  "reqTime": "1694051706",
  "body": "商品描述",
  "version": "1.0",
  "channelExtra": "{\"authCode\":\"284957415846666792\"}",
  "appId": "6447428682ca7458118af79f",
  "clientIp": "192.166.1.132",
  "notifyUrl": "https://example.com/notify",
  "signType": "MD5",
  "currency": "CNY",
  "mchNo": "M1682391685"
}