mark 阿里支付

it2022-05-08  10

开源软件 企业版特惠 高校版 博客 我的码云     ··     8月18日(周六)成都源创会火热报名中,四位一线行业大牛与你面对面,探讨区块链技术热潮下的冷思考。 开源项目  >  WEB应用开发  >  Web开发框架  捐赠0   Watch157   Star321   Fork58

 eric / simbaJava

 代码  Issues 0  Pull Requests 0  附件 0  Wiki 0  统计  服务   一个基于spring boot + spring cloud的敏捷开发框架,一键生成CRUD及管理后台页面,后台管理系统使用Bootstrap开发,集成Redis实现分布式Session,集成Spring Cache,邮件,阿里OSS,极光推送,极光短信,微信公众号,微信硬件平台,Groovy,自动化部署服务器,微服务监控等Spring Cloud全家桶------可以关注微信公众号 Simba技术交流 不定期推送Simba框架的使用方法及设计思路,或者一些技术分享 如果有公司需要系统架构设计师证书挂靠的,也欢迎随时找我  680 次提交  1 个分支  0 个标签  0 个发行版  6 位贡献者 克隆/下载  master       simba /   framework  /   simba-alipay  /   src  /   main  /   java  /   com  /   simba  /   alipay  /   util  /   AliPayUtil.java 一键复制 编辑 原始数据 按行查看 历史   AliPayUtil.java 18.00 KB →   loceme.student@163.com 提交于 23天前 . 支付宝企业支付 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 package com . simba . alipay . util ; import java.util.HashMap ; import java.util.List ; import java.util.Map ; import javax.annotation.PostConstruct ; import org.apache.commons.lang3.StringUtils ; import org.apache.commons.lang3.math.NumberUtils ; import org.apache.commons.logging.Log ; import org.apache.commons.logging.LogFactory ; import org.springframework.beans.factory.annotation.Value ; import org.springframework.stereotype.Component ; import com.alipay.api.AlipayApiException ; import com.alipay.api.AlipayClient ; import com.alipay.api.DefaultAlipayClient ; import com.alipay.api.domain.AlipayTradeAppPayModel ; import com.alipay.api.internal.util.AlipaySignature ; import com.alipay.api.request.AlipayDataDataserviceBillDownloadurlQueryRequest ; import com.alipay.api.request.AlipayFundTransOrderQueryRequest ; import com.alipay.api.request.AlipayFundTransToaccountTransferRequest ; import com.alipay.api.request.AlipayTradeAppPayRequest ; import com.alipay.api.request.AlipayTradeCancelRequest ; import com.alipay.api.request.AlipayTradeCloseRequest ; import com.alipay.api.request.AlipayTradeCreateRequest ; import com.alipay.api.request.AlipayTradeFastpayRefundQueryRequest ; import com.alipay.api.request.AlipayTradeOrderSettleRequest ; import com.alipay.api.request.AlipayTradePayRequest ; import com.alipay.api.request.AlipayTradePrecreateRequest ; import com.alipay.api.request.AlipayTradeQueryRequest ; import com.alipay.api.request.AlipayTradeRefundRequest ; import com.alipay.api.response.AlipayDataDataserviceBillDownloadurlQueryResponse ; import com.alipay.api.response.AlipayFundTransOrderQueryResponse ; import com.alipay.api.response.AlipayFundTransToaccountTransferResponse ; import com.alipay.api.response.AlipayTradeAppPayResponse ; import com.alipay.api.response.AlipayTradeCancelResponse ; import com.alipay.api.response.AlipayTradeCloseResponse ; import com.alipay.api.response.AlipayTradeCreateResponse ; import com.alipay.api.response.AlipayTradeFastpayRefundQueryResponse ; import com.alipay.api.response.AlipayTradeOrderSettleResponse ; import com.alipay.api.response.AlipayTradePayResponse ; import com.alipay.api.response.AlipayTradePrecreateResponse ; import com.alipay.api.response.AlipayTradeQueryResponse ; import com.alipay.api.response.AlipayTradeRefundResponse ; import com.simba.alipay.cosntantData.AliPayConstantData ; import com.simba.alipay.model.CreateOrder ; import com.simba.alipay.model.EnterprisePay ; import com.simba.alipay.model.PayOrder ; import com.simba.alipay.model.Precreate ; import com.simba.alipay.model.RoyaltyParameter ; import com.simba.exception.BussException ; import com.simba.framework.util.json.FastJsonUtil ; import com.simba.model.constant.ConstantData ; /** * 阿里支付工具类 * * @author caozhejun * */ @Component public class AliPayUtil { private static final Log logger = LogFactory . getLog ( AliPayUtil . class ); @Value ( "${alipay.appid}" ) private String appId ; /** * 应用的私钥 */ @Value ( "${alipay.private.key}" ) private String privateKey ; /** * 支付宝的公钥 */ @Value ( "${alipay.public.key}" ) private String publicKey ; @Value ( "${alipay.domain}" ) private String domain ; private AlipayClient alipayClient ; /** * 回调通知url */ private String callbackUrl ; @PostConstruct private void init () { if ( StringUtils . isEmpty ( appId ) || StringUtils . isEmpty ( privateKey ) || StringUtils . isEmpty ( publicKey ) || StringUtils . isEmpty ( domain )) { logger . warn ( "没有配置阿里支付相关信息,不能使用阿里支付功能" ); return ; } alipayClient = new DefaultAlipayClient ( AliPayConstantData . payUrl , appId , privateKey , AliPayConstantData . format , ConstantData . DEFAULT_CHARSET , publicKey , AliPayConstantData . signType ); callbackUrl = domain + "/alipay/callback" ; } /** * 交易查询(该接口提供所有支付宝支付订单的查询,商户可以通过该接口主动查询订单状态,完成下一步的业务逻辑。 需要调用查询接口的情况: * 当商户后台、网络、服务器等出现异常,商户系统最终未接收到支付通知; 调用支付接口后,返回系统错误或未知交易状态情况; * 调用alipay.trade.pay,返回INPROCESS的状态; 调用alipay.trade.cancel之前,需确认支付状态) * * @param out_trade_no * 支付时传入的商户订单号,与trade_no必填一个 * @param trade_no * 支付时返回的支付宝交易号,与out_trade_no必填一个 * @return * @throws AlipayApiException */ public AlipayTradeQueryResponse query ( String out_trade_no , String trade_no ) throws AlipayApiException { checkParams ( out_trade_no , trade_no ); AlipayTradeQueryRequest request = new AlipayTradeQueryRequest (); // 创建API对应的request类 request . setBizContent ( "{" + " \"out_trade_no\":\"" + StringUtils . defaultString ( out_trade_no ) + "\"," + " \"trade_no\":\"" + StringUtils . defaultString ( trade_no ) + "\"" + " }" ); // 设置业务参数 AlipayTradeQueryResponse response = alipayClient . execute ( request ); // 通过alipayClient调用API,获得对应的response类 logger . info ( "交易查询返回结果:" + response . getBody ()); return response ; } private void checkParams ( String out_trade_no , String trade_no ) { if ( StringUtils . isEmpty ( out_trade_no ) && StringUtils . isEmpty ( trade_no )) { throw new BussException ( "支付时传入的商户订单号和支付时返回的支付宝交易号不能同时为空" ); } } /** * 交易退款(当交易发生之后一段时间内,由于买家或者卖家的原因需要退款时,卖家可以通过退款接口将支付款退还给买家,支付宝将在收到退款请求并且验证成功之后,按照退款规则将支付款按原路退到买家帐号上。 * 交易超过约定时间(签约时设置的可退款时间)的订单无法进行退款 * 支付宝退款支持单笔交易分多次退款,多次退款需要提交原支付订单的商户订单号和设置不同的退款单号。一笔退款失败后重新提交,要采用原来的退款单号。总退款金额不能超过用户实际支付金额) * * @param out_trade_no * 支付时传入的商户订单号,与trade_no必填一个 * @param trade_no * 支付时返回的支付宝交易号,与out_trade_no必填一个 * @param out_request_no * 本次退款请求流水号,部分退款时必传 * @param refund_amount * 本次退款金额 * @return * @throws AlipayApiException */ public AlipayTradeRefundResponse refund ( String out_trade_no , String trade_no , String out_request_no , String refund_amount ) throws AlipayApiException { checkParams ( out_trade_no , trade_no ); AlipayTradeRefundRequest request = new AlipayTradeRefundRequest (); // 创建API对应的request类 request . setBizContent ( "{" + " \"out_trade_no\":\"" + StringUtils . defaultString ( out_trade_no ) + "\"," + " \"trade_no\":\"" + StringUtils . defaultString ( trade_no ) + "\"," + " \"out_request_no\":\"" + StringUtils . defaultString ( out_request_no ) + "\"," + " \"refund_amount\":\"" + StringUtils . defaultString ( refund_amount ) + "\"" + " }" ); // 设置业务参数 AlipayTradeRefundResponse response = alipayClient . execute ( request ); // 通过alipayClient调用API,获得对应的response类 logger . info ( "交易退款返回结果:" + response . getBody ()); return response ; } /** * 查询对账单下载地址 * * @param bill_date * 需要下载的账单日期,最晚是当期日期的前一天 * @return * @throws AlipayApiException */ public AlipayDataDataserviceBillDownloadurlQueryResponse billDown ( String bill_date ) throws AlipayApiException { AlipayDataDataserviceBillDownloadurlQueryRequest request = new AlipayDataDataserviceBillDownloadurlQueryRequest (); // 创建API对应的request类 request . setBizContent ( "{" + " \"bill_type\":\"trade\"," + " \"bill_date\":\"" + bill_date + "\"" + " }" ); // 设置业务参数 AlipayDataDataserviceBillDownloadurlQueryResponse response = alipayClient . execute ( request ); logger . info ( "查询对账单下载地址返回结果:" + response . getBody ()); return response ; } /** * 统一收单交易退款查询(商户可使用该接口查询自已通过alipay.trade.refund提交的退款请求是否执行成功。 * 该接口的返回码10000,仅代表本次查询操作成功,不代表退款成功。如果该接口返回了查询数据,则代表退款成功,如果没有查询到则代表未退款成功,可以调用退款接口进行重试。重试时请务必保证退款请求号一致) * * @param trade_no * 支付宝交易号,和商户订单号不能同时为空 * @param out_trade_no * 订单支付时传入的商户订单号,和支付宝交易号不能同时为空。 * trade_no,out_trade_no如果同时存在优先取trade_no * @param out_request_no * 请求退款接口时,传入的退款请求号,如果在退款请求时未传入,则该值为创建交易时的外部交易号 * @return * @throws AlipayApiException */ public AlipayTradeFastpayRefundQueryResponse refundQuery ( String trade_no , String out_trade_no , String out_request_no ) throws AlipayApiException { AlipayTradeFastpayRefundQueryRequest request = new AlipayTradeFastpayRefundQueryRequest (); request . setBizContent ( "{" + "\"trade_no\":\"" + StringUtils . defaultString ( trade_no ) + "\"," + "\"out_trade_no\":\"" + StringUtils . defaultString ( out_trade_no ) + "\"," + "\"out_request_no\":\"" + StringUtils . defaultString ( out_request_no ) + "\"" + " }" ); AlipayTradeFastpayRefundQueryResponse response = alipayClient . execute ( request ); logger . info ( "统一收单交易退款查询返回结果:" + response . getBody ()); return response ; } /** * 统一收单交易结算(用于在线下场景交易支付后,进行结算) * * @param out_request_no * 结算请求流水号 开发者自行生成并保证唯一性 * @param trade_no * 支付宝订单号 * @param royalty_parameters * 分账明细信息 * @param operator_id * 操作员id * @return * @throws AlipayApiException */ public AlipayTradeOrderSettleResponse orderSettle ( String out_request_no , String trade_no , List < RoyaltyParameter > royalty_parameters , String operator_id ) throws AlipayApiException { AlipayTradeOrderSettleRequest request = new AlipayTradeOrderSettleRequest (); request . setBizContent ( "{" + "\"out_request_no\":\"" + StringUtils . defaultString ( out_request_no ) + "\"," + "\"trade_no\":\"" + StringUtils . defaultString ( trade_no ) + "\"," + " \"royalty_parameters\":" + FastJsonUtil . toJson ( royalty_parameters ) + "," + "\"operator_id\":\"" + StringUtils . defaultString ( operator_id ) + "\"" + " }" ); AlipayTradeOrderSettleResponse response = alipayClient . execute ( request ); logger . info ( "统一收单交易结算返回结果:" + response . getBody ()); return response ; } /** * 统一收单交易关闭(用于交易创建后,用户在一定时间内未进行支付,可调用该接口直接将未付款的交易进行关闭) * * @param out_trade_no * 订单支付时传入的商户订单号,和支付宝交易号不能同时为空。 * trade_no,out_trade_no如果同时存在优先取trade_no * @param trade_no * 该交易在支付宝系统中的交易流水号。最短 16 位,最长 64 位。和out_trade_no不能同时为空,如果同时传了 * out_trade_no和 trade_no,则以 trade_no为准 * @param operator_id * 卖家端自定义的的操作员 ID * @return * @throws AlipayApiException */ public AlipayTradeCloseResponse close ( String out_trade_no , String trade_no , String operator_id ) throws AlipayApiException { AlipayTradeCloseRequest request = new AlipayTradeCloseRequest (); request . setBizContent ( "{" + "\"trade_no\":\"" + StringUtils . defaultString ( trade_no ) + "\"," + "\"out_trade_no\":\"" + StringUtils . defaultString ( out_trade_no ) + "\"," + "\"operator_id\":\"" + StringUtils . defaultString ( operator_id ) + "\"" + " }" ); AlipayTradeCloseResponse response = alipayClient . execute ( request ); logger . info ( "统一收单交易关闭返回结果:" + response . getBody ()); return response ; } /** * 统一收单交易撤销(支付交易返回失败或支付系统超时,调用该接口撤销交易。如果此订单用户支付失败,支付宝系统会将此订单关闭;如果用户支付成功,支付宝系统会将此订单资金退还给用户。 * 注意:只有发生支付系统超时或者支付结果未知时可调用撤销,其他正常支付的单如需实现相同功能请调用申请退款API。提交支付交易后调用【查询订单API】,没有明确的支付结果再调用【撤销订单API】) * * @param out_trade_no * 原支付请求的商户订单号,和支付宝交易号不能同时为空 * @param trade_no * 支付宝交易号,和商户订单号不能同时为空 * @return * @throws AlipayApiException */ public AlipayTradeCancelResponse cancel ( String out_trade_no , String trade_no ) throws AlipayApiException { AlipayTradeCancelRequest request = new AlipayTradeCancelRequest (); request . setBizContent ( "{" + "\"out_trade_no\":\"" + StringUtils . defaultString ( out_trade_no ) + "\"," + "\"trade_no\":\"" + StringUtils . defaultString ( trade_no ) + "\"" + " }" ); AlipayTradeCancelResponse response = alipayClient . execute ( request ); logger . info ( "统一收单交易撤销返回结果:" + response . getBody ()); return response ; } /** * 统一收单线下交易预创建(收银员通过收银台或商户后台调用支付宝接口,生成二维码后,展示给用户,由用户扫描二维码完成订单支付) * * @param precreate * @return * @throws AlipayApiException */ public AlipayTradePrecreateResponse precreate ( Precreate precreate ) throws AlipayApiException { AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest (); request . setBizContent ( FastJsonUtil . toJson ( precreate )); AlipayTradePrecreateResponse response = alipayClient . execute ( request ); logger . info ( "统一收单线下交易预创建返回结果:" + response . getBody ()); return response ; } /** * 统一收单交易创建(商户通过该接口进行交易的创建下单) * * @param order * @return * @throws AlipayApiException */ public AlipayTradeCreateResponse create ( CreateOrder order ) throws AlipayApiException { AlipayTradeCreateRequest request = new AlipayTradeCreateRequest (); request . setBizContent ( FastJsonUtil . toJson ( order )); AlipayTradeCreateResponse response = alipayClient . execute ( request ); logger . info ( "统一收单交易创建返回结果:" + response . getBody ()); return response ; } /** * 统一收单交易支付(收银员使用扫码设备读取用户手机支付宝“付款码”/声波获取设备(如麦克风)读取用户手机支付宝的声波信息后,将二维码或条码信息/声波信息通过本接口上送至支付宝发起支付) * * @param order * @return * @throws AlipayApiException */ public AlipayTradePayResponse pay ( PayOrder order ) throws AlipayApiException { AlipayTradePayRequest request = new AlipayTradePayRequest (); request . setBizContent ( FastJsonUtil . toJson ( order )); AlipayTradePayResponse response = alipayClient . execute ( request ); logger . info ( "统一收单交易支付返回结果:" + response . getBody ()); return response ; } /** * 生成APP支付订单 * * @param model * @return * @throws AlipayApiException */ public AlipayTradeAppPayResponse appPay ( AlipayTradeAppPayModel model ) throws AlipayApiException { AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest (); request . setBizModel ( model ); request . setNotifyUrl ( callbackUrl ); // 这里和普通的接口调用不同,使用的是sdkExecute AlipayTradeAppPayResponse response = alipayClient . sdkExecute ( request ); logger . info ( "生成APP支付订单返回结果:" + response . getBody ()); // 就是orderString,可以直接给客户端请求,无需再做处理。 return response ; } /** * 检查支付宝支付回调通知的参数是否正确 * * @param params * @throws AlipayApiException */ public void checkSign ( Map < String , String > params ) throws AlipayApiException { logger . info ( "检查签名参数:" + params . toString ()); boolean flag = AlipaySignature . rsaCheckV1 ( params , publicKey , ConstantData . DEFAULT_CHARSET , "RSA2" ); if (! flag ) { throw new BussException ( "支付宝支付回调url签名错误,可能有人攻击" ); } } /** * 单笔转账到支付宝账户接口 * * @param enterprisePay * @return * @throws AlipayApiException */ public AlipayFundTransToaccountTransferResponse enterprisePay ( EnterprisePay enterprisePay ) throws AlipayApiException { String amount = enterprisePay . getAmount (); double money = NumberUtils . toDouble ( amount ) / 100 ; amount = new java . text . DecimalFormat ( "0.00" ). format ( money ); enterprisePay . setAmount ( amount ); AlipayFundTransToaccountTransferRequest request = new AlipayFundTransToaccountTransferRequest (); request . setBizContent ( FastJsonUtil . toJson ( enterprisePay )); return alipayClient . execute ( request ); } /** * 按支付宝转账单据号查询转账订单接口 * * @param orderId * 支付宝转账单据号 * @return * @throws AlipayApiException */ public AlipayFundTransOrderQueryResponse searchEnterprisePayByOrderId ( String orderId ) throws AlipayApiException { Map < String , String > param = new HashMap <>( 1 ); param . put ( "order_id" , orderId ); AlipayFundTransOrderQueryRequest request = new AlipayFundTransOrderQueryRequest (); request . setBizContent ( FastJsonUtil . toJson ( param )); return alipayClient . execute ( request ); } /** * 按商户转账唯一订单号查询转账订单接口 * * @param outBizNo * 商户转账唯一订单号 * @return * @throws AlipayApiException */ public AlipayFundTransOrderQueryResponse searchEnterprisePayByOutBizNo ( String outBizNo ) throws AlipayApiException { Map < String , String > param = new HashMap <>( 1 ); param . put ( "out_biz_no" , outBizNo ); AlipayFundTransOrderQueryRequest request = new AlipayFundTransOrderQueryRequest (); request . setBizContent ( FastJsonUtil . toJson ( param )); return alipayClient . execute ( request ); } }

评论 ( 0 )

评论

© Gitee.com

关于我们 使用条款 意见建议 合作伙伴   OpenAPI Git 大全 帮助文档 APP与插件下载   更新日志 代码片段 码云封面人物  

微信服务号

 官方技术支持QQ群:655903986  git@oschina.cn   码云Gitee 企业版售前及售后使用咨询:400-898-2008 转2 本站带宽由   提供   粤ICP备12009483号-8 深圳市奥思网络科技有限公司版权所有    简 体 /  繁 體 /  English

转载于:https://www.cnblogs.com/wangdaijun/p/9483439.html


最新回复(0)