在fast spring boot fastjson用Alipay支付购买hemingboard购买失败扣款成功怎么办?

条码支付 - 知乎有问题,上知乎。知乎作为中文互联网最大的知识分享平台,以「知识连接一切」为愿景,致力于构建一个人人都可以便捷接入的知识分享网络,让人们便捷地与世界分享知识、经验和见解,发现更大的世界。暂无话题描述关注话题分享来自子话题:阅读全文添加评论分享来自子话题:阅读全文0添加评论分享收藏感谢来自子话题:阅读全文0添加评论分享收藏感谢来自子话题:阅读全文0添加评论分享收藏感谢来自子话题:阅读全文0添加评论分享收藏感谢117支付宝支付后回调处理(Java版) - 为程序员服务
支付宝支付后回调处理(Java版)
回调处理文档
依赖 slf4j,fast
异步通知页面特性
服务器异步通知页面特性
必须保证服务器异步通知页面(notify_url)上无任何字符,如空格、
系统自带抛出的异常提示信息等;
支付宝是用POST方式发送通知信息,因此该页面中获取
的方式,如:request.Form(“out_trade_no”)、$_POST[‘out_trade_no’];
支付宝主动发起通知,该方式才会被启用;
只有在支付宝的交易
中存在该笔交易,且发生了交易状态的改变,支付宝才会通过该方式发起服务器通知(即时到账交易状态为“等待买家付款”的状态默认是不会发送通知的);
服务器间的交互,不像页面跳转
通知可以在页面上显示出来,这种交互方式是不可见的;
第一次交易状态改变(即时到账中此时交易状态是交易完成)时,不仅会返回同步处理结果,而且服务器异步通知页面也会收到支付宝发来的处理结果通知;
程序执行完后必须打印输出“success”(不包含引号)。如果商户反馈给支付宝的字符不是success这7个字符,支付宝服务器会不断重发通知,直到超过24小时22分钟。一般情况下,25小时以内完成8次通知(通知的间隔频率一般是:4m,10m,10m,1h,2h,6h,15h);
程序执行完成后,该页面不能执行页面跳转。如果执行页面跳转,支付宝会收不到success字符,会被支付宝服务器判定为该页面程序运行出现异常,而重发处理结果通知;
等在此页面会失效,即无法获取这些
与运行必须在服务器上,即
上能访问;
该方式的作用主要防止订单丢失,即页面跳转同步通知没有处理订单更新,它则去处理;
当商户收到服务器异步通知并打印出success时,服务器异步通知参数notify_
才会失效。也就是说在支付宝发送同一条异步通知时(包含商户并未成功打印出success导致支付宝重发数次通知),服务器异步通知参数notify_id是不变的。
mvc的Controller处理,
@Controller
public class AlipayCallbackController {
private static Logger logger = LoggerFactory.getLogger(AlipayCallbackController.class);
@Autowired
private AlipayConfig alipayC // 支付宝支付配置
private ExecutorService executorService = Executors.newFixedThreadPool(20);
* 第一步:验证签名,签名通过后进行第二步
* 第二步:按一下步骤进行验证
* 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
* 2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
* 3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email),
* 4、验证app_id是否为该商户本身。上述1、2、3、4有任何一个验证不通过,则表明本次通知是异常通知,务必忽略。
* 在上述验证通过后商户必须根据支付宝不同类型的业务通知,正确的进行不同的业务处理,并且过滤重复的通知结果数据。
* 在支付宝的业务通知中,只有交易通知状态为TRADE_SUCCESS或TRADE_FINISHED时,支付宝才会认定为买家付款成功。
* @param params
@RequestMapping("alipay_callback")
@ResponseBody
public String callback(HttpServletRequest request) {
Map&String, String& params = convertRequestParamsToMap(request); // 将异步通知中收到的待验证所有参数都存放到map中
String paramsJson = JSON.toJSONString(params);
logger.info("支付宝回调,{}", paramsJson);
// 调用SDK验证签名
boolean signVerified = AlipaySignature.rsaCheckV1(params, alipayConfig.getAlipay_public_key(),
alipayConfig.getCharset(), alipayConfig.getSigntype());
if (signVerified) {
logger.info("支付宝回调签名认证成功");
// 按照支付结果异步通知中的描述,对支付结果中的业务内容进行1/2/3/4二次校验,校验成功后在response中返回success,校验失败返回failure
this.check(params);
// 另起线程处理业务
executorService.execute(new Runnable() {
public void run() {
AlipayNotifyParam param = buildAlipayNotifyParam(params);
String trade_status = param.getTradeStatus();
// 支付成功
if (trade_status.equals(AlipayTradeStatus.TRADE_SUCCESS.getStatus())
|| trade_status.equals(AlipayTradeStatus.TRADE_FINISHED.getStatus())) {
// 处理支付成功逻辑
// 处理业务逻辑。。。
myService.process(param);
} catch (Exception e) {
logger.error("支付宝回调业务处理报错,params:" + paramsJson, e);
logger.error("没有处理支付宝回调业务,支付宝交易状态:{},params:{}",trade_status,paramsJson);
// 如果签名验证正确,立即返回success,后续业务另起线程单独处理
// 业务处理失败,可查看日志进行补偿,跟支付宝已经没多大关系。
return "success";
logger.info("支付宝回调签名认证失败,signVerified=false, paramsJson:{}", paramsJson);
return "failure";
} catch (AlipayApiException e) {
logger.error("支付宝回调签名认证失败,paramsJson:{},errorMsg:{}", paramsJson, e.getMessage());
return "failure";
// 将request中的参数转换成Map
private static Map&String, String& convertRequestParamsToMap(HttpServletRequest request) {
Map&String, String& retMap = new HashMap&String, String&();
Set&Entry&String, String[]&& entrySet = request.getParameterMap().entrySet();
for (Entry&String, String[]& entry : entrySet) {
String name = entry.getKey();
String[] values = entry.getValue();
int valLen = values.
if (valLen == 1) {
retMap.put(name, values[0]);
} else if (valLen & 1) {
StringBuilder sb = new StringBuilder();
for (String val : values) {
sb.append(",").append(val);
retMap.put(name, sb.toString().substring(1));
retMap.put(name, "");
return retM
private AlipayNotifyParam buildAlipayNotifyParam(Map&String, String& params) {
String json = JSON.toJSONString(params);
return JSON.parseObject(json, AlipayNotifyParam.class);
* 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
* 2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
* 3、校验通知中的seller_id(或者seller_email)是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email),
* 4、验证app_id是否为该商户本身。上述1、2、3、4有任何一个验证不通过,则表明本次通知是异常通知,务必忽略。
* 在上述验证通过后商户必须根据支付宝不同类型的业务通知,正确的进行不同的业务处理,并且过滤重复的通知结果数据。
* 在支付宝的业务通知中,只有交易通知状态为TRADE_SUCCESS或TRADE_FINISHED时,支付宝才会认定为买家付款成功。
* @param params
* @throws AlipayApiException
private void check(Map&String, String& params) throws AlipayApiException {
String outTradeNo = params.get("out_trade_no");
// 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
Order order = getOrderByOutTradeNo(outTradeNo); // 这个方法自己实现
if (order == null) {
throw new AlipayApiException("out_trade_no错误");
// 2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
long total_amount = new BigDecimal(params.get("total_amount")).multiply(new BigDecimal(100)).longValue();
if (total_amount != order.getPayPrice().longValue()) {
throw new AlipayApiException("error total_amount");
// 3、校验通知中的seller_id(或者seller_email)是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email),
// 第三步可根据实际情况省略
// 4、验证app_id是否为该商户本身。
if (!params.get("app_id").equals(alipayConfig.getAppid())) {
throw new AlipayApiException("app_id不一致");
支付宝参数配置:
@Component
public class AlipayConfig {
private String appid = "";
private String rsa_private_key = "";
// 异步回调地址
private String notify_
// 同步回调地址
private String return_
// 请求网关地址
private String gateway_
private String charset = "UTF-8";
// 返回格式
private String format = "json";
// 支付宝公钥
private String alipay_public_key = "";
private String signtype = "RSA2";
public String getAppid() {
public void setAppid(String appid) {
this.appid =
public String getRsa_private_key() {
return rsa_private_
public void setRsa_private_key(String rsa_private_key) {
this.rsa_private_key = rsa_private_
public String getNotify_url() {
return notify_
public void setNotify_url(String notify_url) {
this.notify_url = notify_
public String getReturn_url() {
return return_
public void setReturn_url(String return_url) {
this.return_url = return_
public String getGateway_url() {
return gateway_
public void setGateway_url(String gateway_url) {
this.gateway_url = gateway_
public String getCharset() {
public void setCharset(String charset) {
this.charset =
public String getFormat() {
public void setFormat(String format) {
this.format =
public String getAlipay_public_key() {
return alipay_public_
public void setAlipay_public_key(String alipay_public_key) {
this.alipay_public_key = alipay_public_
public String getSigntype() {
public void setSigntype(String signtype) {
this.signtype =
支付宝返回结果对应的参数类:
public class AlipayNotifyParam implements Serializable {
private String appId;
private String tradeNo; // 支付宝交易凭证号
private String outTradeNo; // 原支付请求的商户订单号
private String outBizNo; // 商户业务ID,主要是退款通知中返回退款申请的流水号
private String buyerId; // 买家支付宝账号对应的支付宝唯一用户号。以2088开头的纯16位数字
private String buyerLogonId; // 买家支付宝账号
private String sellerId; // 卖家支付宝用户号
private String sellerE // 卖家支付宝账号
private String tradeS // 交易目前所处的状态,见交易状态说明
private BigDecimal totalA // 本次交易支付的订单金额
private BigDecimal receiptA // 商家在交易中实际收到的款项
private BigDecimal buyerPayA // 用户在交易中支付的金额
private BigDecimal refundF // 退款通知中,返回总退款金额,单位为元,支持两位小数
private S // 商品的标题/交易标题/订单标题/订单关键字等
private S // 该订单的备注、描述、明细等。对应请求时的body参数,原样通知回来
private Date gmtC // 该笔交易创建的时间。格式为yyyy-MM-dd HH:mm:ss
private Date gmtP // 该笔交易的买家付款时间。格式为yyyy-MM-dd HH:mm:ss
private Date gmtR // 该笔交易的退款时间。格式为yyyy-MM-dd HH:mm:ss.S
private Date gmtC // 该笔交易结束时间。格式为yyyy-MM-dd HH:mm:ss
private String fundBillL // 支付成功的各个渠道金额信息,array
private String passbackP // 公共回传参数,如果请求时传递了该参数,则返回给商户时会在异步通知时将该参数原样返回。
public void setAppId(String appId) {
this.appId = appId;
public String getAppId() {
return this.appId;
/** 设置 支付宝交易凭证号,对应字段 trade_record_alipay_detail.trade_no */
public void setTradeNo(String tradeNo) {
this.tradeNo = tradeNo;
/** 获取 支付宝交易凭证号,对应字段 trade_record_alipay_detail.trade_no */
public String getTradeNo() {
return this.tradeNo;
/** 设置 原支付请求的商户订单号,对应字段 trade_record_alipay_detail.out_trade_no */
public void setOutTradeNo(String outTradeNo) {
this.outTradeNo = outTradeNo;
/** 获取 原支付请求的商户订单号,对应字段 trade_record_alipay_detail.out_trade_no */
public String getOutTradeNo() {
return this.outTradeNo;
/** 设置 商户业务ID,主要是退款通知中返回退款申请的流水号,对应字段 trade_record_alipay_detail.out_biz_no */
public void setOutBizNo(String outBizNo) {
this.outBizNo = outBizNo;
/** 获取 商户业务ID,主要是退款通知中返回退款申请的流水号,对应字段 trade_record_alipay_detail.out_biz_no */
public String getOutBizNo() {
return this.outBizNo;
/** 设置 买家支付宝账号对应的支付宝唯一用户号。以2088开头的纯16位数字,对应字段 trade_record_alipay_detail.buyer_id */
public void setBuyerId(String buyerId) {
this.buyerId = buyerId;
/** 获取 买家支付宝账号对应的支付宝唯一用户号。以2088开头的纯16位数字,对应字段 trade_record_alipay_detail.buyer_id */
public String getBuyerId() {
return this.buyerId;
/** 设置 买家支付宝账号,对应字段 trade_record_alipay_detail.buyer_logon_id */
public void setBuyerLogonId(String buyerLogonId) {
this.buyerLogonId = buyerLogonId;
/** 获取 买家支付宝账号,对应字段 trade_record_alipay_detail.buyer_logon_id */
public String getBuyerLogonId() {
return this.buyerLogonId;
/** 设置 卖家支付宝用户号,对应字段 trade_record_alipay_detail.seller_id */
public void setSellerId(String sellerId) {
this.sellerId = sellerId;
/** 获取 卖家支付宝用户号,对应字段 trade_record_alipay_detail.seller_id */
public String getSellerId() {
return this.sellerId;
/** 设置 卖家支付宝账号,对应字段 trade_record_alipay_detail.seller_email */
public void setSellerEmail(String sellerEmail) {
this.sellerEmail = sellerE
/** 获取 卖家支付宝账号,对应字段 trade_record_alipay_detail.seller_email */
public String getSellerEmail() {
return this.sellerE
/** 设置 交易目前所处的状态,见交易状态说明,对应字段 trade_record_alipay_detail.trade_status */
public void setTradeStatus(String tradeStatus) {
this.tradeStatus = tradeS
/** 获取 交易目前所处的状态,见交易状态说明,对应字段 trade_record_alipay_detail.trade_status */
public String getTradeStatus() {
return this.tradeS
/** 设置 本次交易支付的订单金额,对应字段 trade_record_alipay_detail.total_amount */
public void setTotalAmount(BigDecimal totalAmount) {
this.totalAmount = totalA
/** 获取 本次交易支付的订单金额,对应字段 trade_record_alipay_detail.total_amount */
public BigDecimal getTotalAmount() {
return this.totalA
/** 设置 商家在交易中实际收到的款项,对应字段 trade_record_alipay_detail.receipt_amount */
public void setReceiptAmount(BigDecimal receiptAmount) {
this.receiptAmount = receiptA
/** 获取 商家在交易中实际收到的款项,对应字段 trade_record_alipay_detail.receipt_amount */
public BigDecimal getReceiptAmount() {
return this.receiptA
/** 设置 用户在交易中支付的金额,对应字段 trade_record_alipay_detail.buyer_pay_amount */
public void setBuyerPayAmount(BigDecimal buyerPayAmount) {
this.buyerPayAmount = buyerPayA
/** 获取 用户在交易中支付的金额,对应字段 trade_record_alipay_detail.buyer_pay_amount */
public BigDecimal getBuyerPayAmount() {
return this.buyerPayA
/** 设置 退款通知中,返回总退款金额,单位为元,支持两位小数,对应字段 trade_record_alipay_detail.refund_fee */
public void setRefundFee(BigDecimal refundFee) {
this.refundFee = refundF
/** 获取 退款通知中,返回总退款金额,单位为元,支持两位小数,对应字段 trade_record_alipay_detail.refund_fee */
public BigDecimal getRefundFee() {
return this.refundF
/** 设置 商品的标题/交易标题/订单标题/订单关键字等,对应字段 trade_record_alipay_detail.subject */
public void setSubject(String subject) {
this.subject =
/** 获取 商品的标题/交易标题/订单标题/订单关键字等,对应字段 trade_record_alipay_detail.subject */
public String getSubject() {
return this.
/** 设置 该订单的备注、描述、明细等。对应请求时的body参数,原样通知回来,对应字段 trade_record_alipay_detail.body */
public void setBody(String body) {
this.body =
/** 获取 该订单的备注、描述、明细等。对应请求时的body参数,原样通知回来,对应字段 trade_record_alipay_detail.body */
public String getBody() {
return this.
/** 设置 该笔交易创建的时间。格式为yyyy-MM-dd HH:mm:ss,对应字段 trade_record_alipay_detail.gmt_create */
public void setGmtCreate(Date gmtCreate) {
this.gmtCreate = gmtC
/** 获取 该笔交易创建的时间。格式为yyyy-MM-dd HH:mm:ss,对应字段 trade_record_alipay_detail.gmt_create */
public Date getGmtCreate() {
return this.gmtC
/** 设置 该笔交易的买家付款时间。格式为yyyy-MM-dd HH:mm:ss,对应字段 trade_record_alipay_detail.gmt_payment */
public void setGmtPayment(Date gmtPayment) {
this.gmtPayment = gmtP
/** 获取 该笔交易的买家付款时间。格式为yyyy-MM-dd HH:mm:ss,对应字段 trade_record_alipay_detail.gmt_payment */
public Date getGmtPayment() {
return this.gmtP
/** 设置 该笔交易的退款时间。格式为yyyy-MM-dd HH:mm:ss.S,对应字段 trade_record_alipay_detail.gmt_refund */
public void setGmtRefund(Date gmtRefund) {
this.gmtRefund = gmtR
/** 获取 该笔交易的退款时间。格式为yyyy-MM-dd HH:mm:ss.S,对应字段 trade_record_alipay_detail.gmt_refund */
public Date getGmtRefund() {
return this.gmtR
/** 设置 该笔交易结束时间。格式为yyyy-MM-dd HH:mm:ss,对应字段 trade_record_alipay_detail.gmt_close */
public void setGmtClose(Date gmtClose) {
this.gmtClose = gmtC
/** 获取 该笔交易结束时间。格式为yyyy-MM-dd HH:mm:ss,对应字段 trade_record_alipay_detail.gmt_close */
public Date getGmtClose() {
return this.gmtC
/** 设置 支付成功的各个渠道金额信息,array,对应字段 trade_record_alipay_detail.fund_bill_list */
public void setFundBillList(String fundBillList) {
this.fundBillList = fundBillL
/** 获取 支付成功的各个渠道金额信息,array,对应字段 trade_record_alipay_detail.fund_bill_list */
public String getFundBillList() {
return this.fundBillL
/** 设置 公共回传参数,如果请求时传递了该参数,则返回给商户时会在异步通知时将该参数原样返回。,对应字段 trade_record_alipay_detail.passback_params */
public void setPassbackParams(String passbackParams) {
this.passbackParams = passbackP
/** 获取 公共回传参数,如果请求时传递了该参数,则返回给商户时会在异步通知时将该参数原样返回。,对应字段 trade_record_alipay_detail.passback_params */
public String getPassbackParams() {
return this.passbackP
://blog.csdn.net/thc1987/article/details/
本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。
PS:推荐一个微信公众号: askHarries 或者qq群:,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
转载请注明原文出处:
追心中的海,逐世界的梦
原文地址:, 感谢原作者分享。
您可能感兴趣的代码支付宝支付-PC电脑网站支付 - 简书
支付宝支付-PC电脑网站支付
支付产品全面升级(更新时间: ),若您使用的是老接口,请移步。
支持沙盒环境的测试
此项目已开源欢迎Start、PR、发起Issues一起讨论交流共同进步
1、有图有真相
使用手机扫码进行支付
i统一收单下单并支付页面接口alipay.trade.page.pay
手机扫码进行支付
PC 端登录账号进行支付
登录账号进行支付
进去支付宝收银台
输入交易密码进行支付
正在跳转到商户页面
商户页面、这里只是将签名验证的结果显示在页面上
PC支付两次扣款记录
2、如何申请PC电脑网站支付
费率、申请条件、签约、使用场景
3、如何快速接入PC电脑网站支付
如果你是使用新版本接入就比较方便了,因为官方提供了
3.1 接口调用流程图
主要涉及到的接口有:
退款查询接口
交易关闭接口
查询对账单下载地址查询接口
3.2 支付接口封装
初始化接口
alipayClient = new DefaultAlipayClient(SERVICE_URL, APP_ID, PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);
封装支付接口并将SDK生成的表单响应给页面
* 电脑网站支付(PC支付)
* @param model
* @param notifyUrl
* @param returnUrl
* @throws AlipayApiException
* @throws IOException
public static void tradePage(HttpServletResponse httpResponse, AlipayTradePayModel model, String notifyUrl, String returnUrl) throws AlipayApiException, IOException{
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
request.setBizModel(model);
request.setNotifyUrl(notifyUrl);
request.setReturnUrl(returnUrl);
String form
= alipayClient.pageExecute(request).getBody();//调用SDK生成表单
httpResponse.setContentType("text/charset=" + CHARSET);
httpResponse.getWriter().write(form);//直接将完整的表单html输出到页面
httpResponse.getWriter().flush();
httpResponse.getWriter().close();
3.3 其他支付接口封装
3.4 封装测试
public void pcPay(){
String totalAmount = "88.88";
String outTradeNo =StringUtils.getOutTradeNo();
log.info("pc outTradeNo&"+outTradeNo);
String returnUrl = AliPayApi.NOTIFY_DOMAIN + "/alipay/return_url";
String notifyUrl = AliPayApi.NOTIFY_DOMAIN + "/alipay/notify_url";
AlipayTradePayModel model = new AlipayTradePayModel();
model.setOutTradeNo(outTradeNo);
model.setProductCode("FAST_INSTANT_TRADE_PAY");
model.setTotalAmount(totalAmount);
model.setSubject("Javen PC支付测试");
model.setBody("Javen IJPay PC支付测试");
AliPayApi.tradePage(getResponse(),model , notifyUrl, returnUrl);
} catch (Exception e) {
e.printStackTrace();
异步通知处理
public void notify_url() {
// 获取支付宝POST过来反馈信息
Map&String, String& params = AliPayApi.toMap(getRequest());
for (Map.Entry&String, String& entry : params.entrySet()) {
System.out.println(entry.getKey() + " = " + entry.getValue());
boolean verify_result = AlipaySignature.rsaCheckV1(params, AliPayApi.ALIPAY_PUBLIC_KEY, AliPayApi.CHARSET,
AliPayApi.SIGN_TYPE);
if (verify_result) {// 验证成功
// TODO 请在这里加上商户的业务逻辑程序代码 异步通知可能出现订单重复通知 需要做去重处理
System.out.println("notify_url 验证成功succcess");
renderText("success");
System.out.println("notify_url 验证失败");
renderText("failure");
} catch (AlipayApiException e) {
e.printStackTrace();
renderText("failure");
同步商户页面验签,这里只是返回验签的状态
public void return_url() {
// 获取支付宝GET过来反馈信息
Map&String, String& map = AliPayApi.toMap(getRequest());
for (Map.Entry&String, String& entry : map.entrySet()) {
System.out.println(entry.getKey() + " = " + entry.getValue());
boolean verify_result = AlipaySignature.rsaCheckV1(map, AliPayApi.ALIPAY_PUBLIC_KEY, AliPayApi.CHARSET,
AliPayApi.SIGN_TYPE);
if (verify_result) {// 验证成功
// TODO 请在这里加上商户的业务逻辑程序代码
System.out.println("return_url 验证成功");
renderText("success");
System.out.println("return_url 验证失败");
renderText("failure");
} catch (AlipayApiException e) {
e.printStackTrace();
renderText("failure");
将参数转化为Map,为验签做准备
* @param request
public static Map&String, String& toMap(HttpServletRequest request) {
System.out.println("&&&&" + request.getQueryString());
Map&String, String& params = new HashMap&String, String&();
Map&String, String[]& requestParams = request.getParameterMap();
for (Iterator&String& iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i & values. i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
// 乱码解决,这段代码在出现乱码时使用。
// valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
4、测试数据
异步通知的参数
gmt_create =
charset = UTF-8
notify_time =
gmt_payment =
subject = Javen PC支付测试
sign = ZYQO+lzxAMDj8Al25KoJzSXegrx1rriBMGLOAEyiNHEac0OMe5e49ZW6m0waDSmTBDX8bwEHUjAk8rdCXTXPzNQSVP0p+46V+8k9AHiEiom6OzV3ZTLzGXGw8A8lnrGPYeCDmKSa3pogJKP0Ob7PyBRgz4HWydWC4P+G1yYEjvVX8kK2XbM6bMauW23a0AklvZbve6WUwUpkioMNLCOHAQzPBDW/LaoDUGx6GN6f3sFDsomBJ03w9rJgqZCs1zw29HHIW4kNFrLcQFleaC+2NnNPLhVanH1iXcK8800dsOXagRPuoy9Gr2EYGV+hSOiVE+XszBKIWTlAbZpE5QgJ6g==
buyer_id = 4200
body = Javen IJPay PC支付测试
invoice_amount = 88.88
version = 1.0
notify_id = 43749ffb4d02c02f4bfc5ee4fe5761ehjm
fund_bill_list = [{"amount":"88.88","fundChannel":"ALIPAYACCOUNT"}]
notify_type = trade_status_sync
out_trade_no = 947
total_amount = 88.88
trade_status = TRADE_SUCCESS
trade_no = 1311
auth_app_id = 7659
receipt_amount = 88.88
point_amount = 0.00
sign_type = RSA2
buyer_pay_amount = 88.88
app_id = 7659
seller_id = 2465
notify_url 验证成功succcess
商户页面同步的参数
&&&&total_amount=88.88&timestamp=+13%3A28%3A11&sign=KRn%2FEi%2B8lOpPdmSBg8ZsB9dUsV8la2bMWaFGFs5R2hhQOP283m%2BolOwFamfC%2B1thxfIsEi92w99lH24K044yj6aLAN8mJq3umQTRI6j2SvZgn1Ufgpd5KdjfmpEAR5omFOJJP%2FDXIb2zEFs6VvA60RmpwYT5mHbujSWDUvj7X0LX1SGd5l90DbyUDtfMe%2FRSqBFd0iIDLloa78a3dPqHcId3mUKP4RrzZBGWNbAYxrZiEslmZiU%2BnT9K0zL9t%2BVm%2B24pHWsgVOR7hb4UicT%2FfHk6VnDPTnOlfVfJD3vOE2FP6N0jgj0QEKNIynOp6t74zmE8Xkca3pGQnkYyrUEQyg%3D%3D&trade_no=1311&sign_type=RSA2&auth_app_id=7659&charset=UTF-8&seller_id=2465&method=alipay.trade.page.pay.return&app_id=7659&out_trade_no=947&version=1.0
charset = UTF-8
out_trade_no = 947
method = alipay.trade.page.pay.return
total_amount = 88.88
sign = KRn/Ei+8lOpPdmSBg8ZsB9dUsV8la2bMWaFGFs5R2hhQOP283m+olOwFamfC+1thxfIsEi92w99lH24K044yj6aLAN8mJq3umQTRI6j2SvZgn1Ufgpd5KdjfmpEAR5omFOJJP/DXIb2zEFs6VvA60RmpwYT5mHbujSWDUvj7X0LX1SGd5l90DbyUDtfMe/RSqBFd0iIDLloa78a3dPqHcId3mUKP4RrzZBGWNbAYxrZiEslmZiU+nT9K0zL9t+Vm+24pHWsgVOR7hb4UicT/fHk6VnDPTnOlfVfJD3vOE2FP6N0jgj0QEKNIynOp6t74zmE8Xkca3pGQnkYyrUEQyg==
trade_no = 1311
auth_app_id = 7659
version = 1.0
sign_type = RSA2
app_id = 7659
seller_id = 2465
timestamp =
return_url 验证成功
推荐阅读:
专注Android、微信开发。公众号javenlife
所有的接口支持沙盒环境的测试 1、前言 前面几篇文件详细介绍了 支付宝提现、扫码支付、条码支付、Wap支付、App支付 支付宝支付-提现到个人支付宝 支付宝支付-扫码支付 支付宝支付-刷卡支付(条码支付) 支付宝Wap支付你了解多少? Android版-支付宝APP支付 一...
1、App支付简介 买家在手机、掌上电脑等无线设备的应用程序内,可通过支付宝进行付款购买特定服务或商品,资金即时到账。 2、App支付申请条件 1.申请前必须拥有经过实名认证的支付宝账户;2.企业或个体工商户可申请;3.需提供真实有效的营业执照,且支付宝账户名称需与营业执照...
在开发商城网站时需要使用第三方支付网关,业界以支付宝和微信支付更为可靠,支付宝属于第三方支付担保平台,提供了如支付,退款,订单查询和商户账单查询等功能。 支付退款流程 注意1: returnUrl:returnUrl在支付请求参数中提供给支付宝网关(步骤1.1),然后由支付...
支付宝简介文档 (适用于ydm-java接口与后台,如有误入,但愿也能给您带来帮助) 此文档写于2017年3月,只能说明此时该文档适用。使用前请查看以下接口支付宝是否提供。 App支付产品 批量付款到支付宝账户 (链接如有发生变化,请在官方文档中寻找此产品,一般情况下,产品...
之前由于项目需要,我所负责的产品有接入支付宝,今天抽出时间整理了出了与支付宝对接的流程。文章大部分内容都是直接引用的蚂蚁金服开放平台上的开发文档,我只是做了一些整理。如果有兴趣,可以点击下面的网址阅读详细的开发文档。(内容来源:https://openhome.alipay...
Block的定义 第一个int为返回值类型,myBlock为block名,第二个int为参数类型,num为传入的形参,{}为block代码块。 Block原理 Objective-C是对C语言的扩展,block的实现是基于指针和函数指针。 使用typedef声明Block(...
& Python有很多小技巧可以帮助我们更好更快的写出Pythonic的程序。 交换两个变量的值你的想法再精彩,那是想法的价值 而你的价值,永远体现在行动之中 如果还停留在想的价值中,请赶快行动, 如果你学习还停止在原处,请咨询我帮助你开始 a, b ='abc',123 ...
这是我约定后的第100篇文章。谢谢那个和我约定的你。我想,约定是否精准并不重要,约定带来的美好才重要。 累的时候总是喜欢沉默。不喜欢和任何人说,找个借口,让同伴离开,一个人走一条夜路。把手机调成静音。走在路上,故意不看消息。因为知道并没有什么紧要。走累了就找个地方坐下。看着...
1、断奶说断就断 突然断奶不仅给宝宝带来心理阴影,也会给妈妈带来极大的胀奶痛苦,宝宝没有做好心理准备和过渡,会容易产生焦虑的情绪,甚至不愿吃东西,这样可能会对宝宝心里和身体健康造成不良的影响。 2、母乳没营养提早断奶 有的人以为到了宝宝6个月以后,母乳就没有营养了就想给婴儿...

我要回帖

更多关于 spring boot fastjson 的文章

 

随机推荐