com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest Maven / Gradle / Ivy
The newest version!
package com.github.binarywang.wxpay.bean.request;
import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.constant.WxPayConstants.TradeType;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamConverter;
import lombok.*;
import lombok.experimental.Accessors;
import me.chanjar.weixin.common.annotation.Required;
import me.chanjar.weixin.common.util.xml.XStreamCDataConverter;
import org.apache.commons.lang3.StringUtils;
import java.util.Map;
/**
*
* 统一下单请求参数对象.
* 参考文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
* Created by Binary Wang on 2016/9/25.
*
*
* @author Binary Wang
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Builder(builderMethodName = "newBuilder")
@NoArgsConstructor
@AllArgsConstructor
@XStreamAlias("xml")
@Accessors(chain = true)
public class WxPayUnifiedOrderRequest extends BaseWxPayRequest {
private static final long serialVersionUID = 4611350167813931828L;
/**
*
* 字段名:接口版本号.
* 变量名:version
* 是否必填:单品优惠必填
* 类型:String(32)
* 示例值:1.0
* 描述:单品优惠新增字段,接口版本号,区分原接口,默认填写1.0。
* 入参新增version后,则支付通知接口也将返回单品优惠信息字段promotion_detail,请确保支付通知的签名验证能通过。
* 更多信息,详见文档:https://pay.weixin.qq.com/wiki/doc/api/danpin.php?chapter=9_102&index=2
*
*/
@XStreamAlias("version")
private String version;
/**
*
* 字段名:设备号.
* 变量名:device_info
* 是否必填:否
* 类型:String(32)
* 示例值:013467007045764
* 描述:终端设备号(门店号或收银设备Id),注意:PC网页或公众号内支付请传"WEB"
*
*/
@XStreamAlias("device_info")
private String deviceInfo;
/**
*
* 字段名:商品描述.
* 变量名:body
* 是否必填:是
* 类型:String(128)
* 示例值: 腾讯充值中心-QQ会员充值
* 描述:商品简单描述,该字段须严格按照规范传递,具体请见参数规定
*
*/
@Required
@XStreamAlias("body")
private String body;
/**
*
* 字段名:商品详情.
* 变量名:detail
* 是否必填:否
* 类型:String(6000)
* 示例值: { "goods_detail":[
* {
* "goods_id":"iphone6s_16G",
* "wxpay_goods_id":"1001",
* "goods_name":"iPhone6s 16G",
* "goods_num":1,
* "price":528800,
* "goods_category":"123456",
* "body":"苹果手机"
* },
* {
* "goods_id":"iphone6s_32G",
* "wxpay_goods_id":"1002",
* "goods_name":"iPhone6s 32G",
* "quantity":1,
* "price":608800,
* "goods_category":"123789",
* "body":"苹果手机"
* }
* ]
* }
* 描述:商品详细列表,使用Json格式,传输签名前请务必使用CDATA标签将JSON文本串保护起来。
* goods_detail []:
* └ goods_id String 必填 32 商品的编号
* └ wxpay_goods_id String 可选 32 微信支付定义的统一商品编号
* └ goods_name String 必填 256 商品名称
* └ goods_num Int 必填 商品数量
* └ price Int 必填 商品单价,单位为分
* └ goods_category String 可选 32 商品类目Id
* └ body String 可选 1000 商品描述信息
*
*/
@XStreamAlias("detail")
@XStreamConverter(value = XStreamCDataConverter.class)
private String detail;
/**
*
* 字段名:附加数据.
* 变量名:attach
* 是否必填:否
* 类型:String(127)
* 示例值: 深圳分店
* 描述: 附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据
*
*/
@XStreamAlias("attach")
@XStreamConverter(value = XStreamCDataConverter.class)
private String attach;
/**
*
* 字段名:商户订单号.
* 变量名:out_trade_no
* 是否必填:是
* 类型:String(32)
* 示例值:20150806125346
* 描述:商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
*
*/
@Required
@XStreamAlias("out_trade_no")
private String outTradeNo;
/**
*
* 字段名:货币类型.
* 变量名:fee_type
* 是否必填:否
* 类型:String(16)
* 示例值:CNY
* 描述: 符合ISO 4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型
*
*/
@XStreamAlias("fee_type")
private String feeType;
/**
*
* 字段名:总金额.
* 变量名:total_fee
* 是否必填:是
* 类型:Int
* 示例值: 888
* 描述:订单总金额,单位为分,详见支付金额
*
*/
@Required
@XStreamAlias("total_fee")
private Integer totalFee;
/**
*
* 字段名:终端IP.
* 变量名:spbill_create_ip
* 是否必填:是
* 类型:String(16)
* 示例值:123.12.12.123
* 描述:APP和网页支付提交用户端ip,Native支付填调用微信支付API的机器IP。
*
*/
@Required
@XStreamAlias("spbill_create_ip")
private String spbillCreateIp;
/**
*
* 字段名:交易起始时间.
* 变量名:time_start
* 是否必填:否
* 类型:String(14)
* 示例值:20091225091010
* 描述:订单生成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。其他详见时间规则
*
*/
@XStreamAlias("time_start")
private String timeStart;
/**
*
* 字段名:交易结束时间.
* 变量名:time_expire
* 是否必填:否
* 类型:String(14)
* 示例值:20091227091010
* 描述:订单失效时间,格式为yyyyMMddHHmmss,如2009年12月27日9点10分10秒表示为20091227091010。其他详见时间规则
* 注意:最短失效时间间隔必须大于5分钟
*
*/
@XStreamAlias("time_expire")
private String timeExpire;
/**
*
* 字段名:商品标记.
* 变量名:goods_tag
* 是否必填:否
* 类型:String(32)
* 示例值:WXG
* 描述:商品标记,代金券或立减优惠功能的参数,说明详见代金券或立减优惠
*
*/
@XStreamAlias("goods_tag")
private String goodsTag;
/**
*
* 字段名:通知地址.
* 变量名:notify_url
* 是否必填:是
* 类型:String(256)
* 示例值:http://www.weixin.qq.com/wxpay/pay.php
* 描述:接收微信支付异步通知回调地址,通知url必须为直接可访问的url,不能携带参数。
*
*/
@Required
@XStreamAlias("notify_url")
private String notifyUrl;
/**
*
* 字段名:交易类型.
* 变量名:trade_type
* 是否必填:是
* 类型:String(16)
* 示例值: JSAPI
* 描述: 取值如下:JSAPI,NATIVE,APP,详细说明见参数规定:
* JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付,统一下单接口trade_type的传参可参考这里
*
*/
@Required
@XStreamAlias("trade_type")
private String tradeType;
/**
*
* 字段名:商品Id.
* 变量名:product_id
* 是否必填:否
* 类型:String(32)
* 示例值:12235413214070356458058
* 描述:trade_type=NATIVE,此参数必传。此id为二维码中包含的商品Id,商户自行定义。
*
*/
@XStreamAlias("product_id")
private String productId;
/**
*
* 字段名:指定支付方式.
* 变量名:limit_pay
* 是否必填:否
* 类型:String(32)
* 示例值:no_credit
* 描述:no_credit--指定不能使用信用卡支付
*
*/
@XStreamAlias("limit_pay")
private String limitPay;
/**
*
* 字段名:用户标识.
* 变量名:openid
* 是否必填:否
* 类型:String(128)
* 示例值:oUpF8uMuAJO_M2pxb1Q9zNjWeS6o
* 描述:trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识。
* openid如何获取,可参考【获取openid】。
* 企业号请使用【企业号OAuth2.0接口】获取企业号内成员userid,再调用【企业号userid转openid接口】进行转换
*
*/
@XStreamAlias("openid")
private String openid;
/**
*
* 字段名:用户子标识.
* 变量名:sub_openid
* 是否必填:否
* 类型:String(128)
* 示例值:oUpF8uMuAJO_M2pxb1Q9zNjWeS6o
* 描述:trade_type=JSAPI,此参数必传,用户在子商户appid下的唯一标识。
* openid和sub_openid可以选传其中之一,如果选择传sub_openid,则必须传sub_appid。
* 下单前需要调用【网页授权获取用户信息】接口获取到用户的Openid。
*
*/
@XStreamAlias("sub_openid")
private String subOpenid;
/**
*
* 字段名:电子发票入口开放标识.
* 变量名: receipt
* 是否必填:否
* 类型:String(8)
* 示例值:Y
* 描述:Y,传入Y时,支付成功消息和支付详情页将出现开票入口。需要在微信支付商户平台或微信公众平台开通电子发票功能,传此字段才可生效
*
*/
@XStreamAlias("receipt")
private String receipt;
/**
*
* 字段名:场景信息.
* 变量名:scene_info
* 是否必填:否,对H5支付来说是必填
* 类型:String(256)
* 示例值:{
* "store_id": "SZT10000",
* "store_name":"腾讯大厦腾大餐厅"
* }
* 描述:该字段用于统一下单时上报场景信息,目前支持上报实际门店信息。
* {
* "store_id": "", //门店唯一标识,选填,String(32)
* "store_name":"”//门店名称,选填,String(64)
* }
*
*/
@XStreamAlias("scene_info")
private String sceneInfo;
/**
*
* 字段名:浏览器指纹.
* 变量名:fingerprint
* 是否必填:否
* 详细参考 https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_7&index=6
*
*/
@XStreamAlias("fingerprint")
private String fingerprint;
/**
*
* 字段名:是否指定服务商分账.
* 变量名:profit_sharing
* 是否必填:否
* 详情:Y-是,需要分账 N-否,不分账,字母要求大写,不传默认不分账
* 详细参考 https://pay.weixin.qq.com/wiki/doc/api/allocation_sl.php?chapter=24_3&index=3
*
*/
@XStreamAlias("profit_sharing")
private String profitSharing;
/**
* 如果配置中已经设置,可以不设置值.
*
* @param notifyUrl 支付回调通知地址
*/
public void setNotifyUrl(String notifyUrl) {
this.notifyUrl = notifyUrl;
}
/**
* 如果配置中已经设置,可以不设置值.
*
* @param tradeType 交易类型
*/
public void setTradeType(String tradeType) {
this.tradeType = tradeType;
}
@Override
protected void checkConstraints() throws WxPayException {
if (TradeType.NATIVE.equals(this.getTradeType()) && StringUtils.isBlank(this.getProductId())) {
throw new WxPayException("当trade_type是'NATIVE'时,需指定非空的product_id值");
}
}
@Override
public void checkAndSign(WxPayConfig config) throws WxPayException {
if (StringUtils.isBlank(this.getNotifyUrl())) {
this.setNotifyUrl(config.getNotifyUrl());
}
if (StringUtils.isBlank(this.getTradeType())) {
this.setTradeType(config.getTradeType());
}
super.checkAndSign(config);
}
@Override
protected void storeMap(Map map) {
map.put("version", version);
map.put("device_info", deviceInfo);
map.put("body", body);
map.put("detail", detail);
map.put("attach", attach);
map.put("out_trade_no", outTradeNo);
map.put("fee_type", feeType);
map.put("total_fee", totalFee.toString());
map.put("spbill_create_ip", spbillCreateIp);
map.put("time_start", timeStart);
map.put("time_expire", timeExpire);
map.put("goods_tag", goodsTag);
map.put("notify_url", notifyUrl);
map.put("trade_type", tradeType);
map.put("product_id", productId);
map.put("limit_pay", limitPay);
map.put("openid", openid);
map.put("sub_openid", subOpenid);
map.put("receipt", receipt);
map.put("scene_info", sceneInfo);
map.put("fingerprint", fingerprint);
map.put("profit_sharing", profitSharing);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy