魔兽世界支付宝退款接口文档支付退款怎么回事

工作需要,写了服务器端的支付和退款功能,包含微信和支付宝,网上也有很多demo可以借鉴,我把我的代码放出来,写的比较简单,有问题的欢迎指正,大家一起学习
微信支付需要调用微信的统一下单接口,而支付宝不用
我写的时候微信和支付宝都单独写了一个工具类,来调用支付,给前端返回需要的数据
ps:支付是可以不需要服务器端的,不过为了安全一点点,所以前端需要调起支付的字段都直接从服务器端返回,前端拿到字段直接调起支付就可以了
Map&String,String& map = new HashMap&String,String&();
switch (record.getCheckType()) {
map = Alipay.prePay(record.getAmount(),out_trade_no);
return ResponseData.ok(map);
map = WXPay.prePay(record.getAmount(),out_trade_no);
return ResponseData.ok(map);
10是支付宝支付,20是微信支付,map里存放前端需要的字段,直接返回给手机端
其中out_trade_no这个是商户自己生成的唯一订单号
public class WXPay {
private static String url = String.format(&https://api.mch./pay/unifiedorder&);
//统一下单
public static Map&String,String& prePay(BigDecimal amount,String out_trade_no){
String entity = genProductArgs(amount,out_trade_no);
byte[] buf = Util.httpPost(url, entity);
String content = new String(buf);
Map&String,String& xml=decodeXml(content);
return getRep(xml);
private static Map&String, String& getRep(Map&String, String& xml) {
Random random = new Random();
List&NameValuePair& signParams = new LinkedList&NameValuePair&();
signParams.add(new BasicNameValuePair(&appid&, Constants.APP_ID_WX));
signParams.add(new BasicNameValuePair(&noncestr&, MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes())));
signParams.add(new BasicNameValuePair(&package&, &prepay_id=&+xml.get(&prepay_id&)));
signParams.add(new BasicNameValuePair(&package&, &Sign=WXPay&));
signParams.add(new BasicNameValuePair(&partnerid&, Constants.MCH_ID));
signParams.add(new BasicNameValuePair(&prepayid&, xml.get(&prepay_id&)));
signParams.add(new BasicNameValuePair(&timestamp&, String.valueOf(System.currentTimeMillis() / 1000)));
xml.put(&sign&, genPackageSign(signParams));
for (int i = 0; i & signParams.size(); i++) {
xml.put(signParams.get(i).getName(),signParams.get(i).getValue());
return removeElements(xml);
private static Map&String, String& removeElements(Map&String, String& xml) {
xml.remove(&appid&);
xml.remove(&mch_id&);
xml.remove(&nonce_str&);
xml.remove(&trade_type&);
//xml.remove(&partnerid&);
xml.remove(&prepay_id&);
xml.remove(&result_code&);
xml.remove(&return_code&);
xml.remove(&return_msg&);
private static String genProductArgs(BigDecimal amount,String out_trade_no) {
StringBuffer xml = new StringBuffer();
String nonceStr = genNonceStr();
xml.append(&&/xml&&);
List&NameValuePair& packageParams = new LinkedList&NameValuePair&();
packageParams.add(new BasicNameValuePair(&appid&, Constants.APP_ID_WX));
packageParams.add(new BasicNameValuePair(&body&, &APP pay test&));
packageParams.add(new BasicNameValuePair(&mch_id&, Constants.MCH_ID));
packageParams.add(new BasicNameValuePair(&nonce_str&, nonceStr));
packageParams.add(new BasicNameValuePair(&notify_url&, &填写服务器的支付回调路径&));
packageParams.add(new BasicNameValuePair(&out_trade_no&,out_trade_no));
packageParams.add(new BasicNameValuePair(&spbill_create_ip&,&127.0.0.1&));
packageParams.add(new BasicNameValuePair(&total_fee&, String.valueOf(amount.movePointRight(2))));
packageParams.add(new BasicNameValuePair(&total_fee&, &1&));
packageParams.add(new BasicNameValuePair(&trade_type&, &APP&));
String sign = genPackageSign(packageParams);
packageParams.add(new BasicNameValuePair(&sign&, sign));
String xmlstring =toXml(packageParams);
public static String genNonceStr() {
Random random = new Random();
return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());
public static String genPackageSign(List&NameValuePair& params) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i & params.size(); i++) {
sb.append(params.get(i).getName());
sb.append('=');
sb.append(params.get(i).getValue());
sb.append('&');
sb.append(&key=&);
sb.append(Constants.API_KEY);
String packageSign = MD5.getMessageDigest(sb.toString().getBytes()).toUpperCase();
return packageS
public static String toXml(List&NameValuePair& params) {
StringBuilder sb = new StringBuilder();
sb.append(&&xml&&);
for (int i = 0; i & params.size(); i++) {
sb.append(&&&+params.get(i).getName()+&&&);
sb.append(params.get(i).getValue());
sb.append(&&/&+params.get(i).getName()+&&&);
sb.append(&&/xml&&);
return sb.toString();
public class Alipay {
public static Map&String,String& prePay(BigDecimal payAbleAmount,String out_trade_no){
//String orderInfo = getOrderInfo(&订单付款&, &订单付款&,out_trade_no,&0.01&);
String orderInfo = getOrderInfo(&订单付款&, &订单付款&,out_trade_no,String.valueOf(payAbleAmount));
String sign = sign(orderInfo);
* 仅需对sign 做URL编码
sign = URLEncoder.encode(sign, &UTF-8&);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
* 完整的符合支付宝参数规范的订单信息
final String payInfo = orderInfo + &&sign=\&& + sign + &\&&& + getSignType();
Map&String,String& map = new HashMap&String, String&();
map.put(&payInfo&, payInfo);
private static String getOrderInfo(String subject, String body,String out_trade_no,String price) {
// 签约合作者身份ID
String orderInfo = &partner=& + &\&& + Constants.PARTNER + &\&&;
// 签约卖家支付宝账号
orderInfo += &&seller_id=& + &\&& + Constants.SELLER + &\&&;
// 商户网站唯一订单号
orderInfo += &&out_trade_no=& + &\&& + out_trade_no + &\&&;
// 商品名称
orderInfo += &&subject=& + &\&& + subject + &\&&;
// 商品详情
orderInfo += &&body=& + &\&& + body + &\&&;
// 商品金额
orderInfo += &&total_fee=& + &\&& + price + &\&&;
// 服务器异步通知页面路径
orderInfo += &?ify_url=& + &\&& + &填写服务器的支付回调路径& + &\&&;
// 服务接口名称, 固定值
orderInfo += &&service=\&mobile.securitypay.pay\&&;
// 支付类型, 固定值
orderInfo += &&payment_type=\&1\&&;
// 参数编码, 固定值
orderInfo += &&_input_charset=\&utf-8\&&;
// 设置未付款交易的超时时间
// 默认30分钟,一旦超时,该笔交易就会自动被关闭。
// 取值范围:1m~15d。
// m-分钟,h-小时,d-天,1c-当天(无论交易何时创建,都在0点关闭)。
// 该参数数值不接受小数点,如1.5h,可转换为90m。
orderInfo += &&it_b_pay=\&30m\&&;
// extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付
// orderInfo += &&extern_token=& + &\&& + extern_token + &\&&;
// 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空
orderInfo += &&return_url=\&\&&;
// 调用银行卡支付,需配置此参数,参与签名, 固定值 (需要签约《无线银行卡快捷支付》才能使用)
// orderInfo += &&paymethod=\&expressGateway\&&;
return orderI
private static String sign(String content) {
return SignUtils.sign(content, Constants.RSA_PRIVATE);
private static String getSignType() {
return &sign_type=\&RSA\&&;
String strResponse =
AlipayTradeRefundResponse response =
AlipayClient alipayClient = new DefaultAlipayClient(url,Constants.APPID_ALIPAY,Constants.RSA_PRIVATE,&json&,&utf-8&,Constants.RSA_PUBLIC);
AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
RefundInfo alidata = new RefundInfo();
alidata.setOut_trade_no(out_trade_no);
alidata.setRefund_amount(refund_amount);
request.setBizContent(JSON.toJSONString(alidata));
response = alipayClient.sdkExecute(request);
if (response.isSuccess()) {
strResponse=&退款成功&;
strResponse=&退款失败&;
return strR
} catch (Exception e) {
strResponse=&退款出错&;
return strR
public class WXRefund {
private static final String url = &https://api.mch./secapi/pay/refund&;
* 微信退款
* @param out_trade_no 商户订单号
* @param total_fee 总金额
* @param refund_fee 退款金额
public static String doRefund(String out_trade_no,int total_fee,int refund_fee) {
InputStream instream =
KeyStore keyStore =
CloseableHttpResponse response =
CloseableHttpClient httpclient =
StringBuilder text = new StringBuilder();
String key = Constants.MCH_ID;
* 注意PKCS12证书 是从微信商户平台-》账户设置-》 API安全 中下载的
keyStore = KeyStore.getInstance(&PKCS12&);
instream = WXRefund.class.getResourceAsStream(&/apiclient_cert.p12&);//P12文件
* 此处要改
keyStore.load(instream, key.toCharArray());// 这里写密码..默认是MCHID
* 此处要改
SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, key.toCharArray())// 这里也是写密码的
// Allow TLSv1 protocol only
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { &TLSv1& }, null, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
//=======================证书配置完成========================
HttpPost httpPost = new HttpPost(url);
String xmlstring = getRefunArgs(out_trade_no,total_fee,refund_fee);
httpPost.setEntity(new StringEntity(xmlstring));
httpPost.setHeader(&Accept&, &application/json&);
httpPost.setHeader(&Content-type&, &application/json&);
response = httpclient.execute(httpPost);
HttpEntity entity = response.getEntity();
if (entity != null) {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(entity.getContent()));
while ((str = bufferedReader.readLine()) != null) {
text.append(str);
EntityUtils.consume(entity);
}catch(Exception e){
}finally {
if(instream != null){
instream.close();
} catch (IOException e) {
e.printStackTrace();
if(response != null){
response.close();
} catch (IOException e) {
e.printStackTrace();
if(httpclient != null){
httpclient.close();
} catch (IOException e) {
e.printStackTrace();
Map&String,String& map = WXPay.decodeXml(text.toString());
String return_msg = map.get(&return_msg&);
if (&OK&.equals(return_msg) && &SUCCESS&.equals(map.get(&return_code&))) {
return &退款成功&;
return return_
//设置请求参数的值
private static String getRefunArgs(String out_trade_no,int total_fee,int refund_fee) {
String nonce_str = WXPay.genNonceStr();
List&NameValuePair& packageParams = new LinkedList&NameValuePair&();
packageParams.add(new BasicNameValuePair(&appid&, Constants.APP_ID_WX));
packageParams.add(new BasicNameValuePair(&mch_id&, Constants.MCH_ID));
packageParams.add(new BasicNameValuePair(&nonce_str&, nonce_str));
packageParams.add(new BasicNameValuePair(&op_user_id&, Constants.MCH_ID));
packageParams.add(new BasicNameValuePair(&out_refund_no&,out_trade_no));
packageParams.add(new BasicNameValuePair(&out_trade_no&,out_trade_no));
packageParams.add(new BasicNameValuePair(&refund_fee&, String.valueOf(refund_fee)));
packageParams.add(new BasicNameValuePair(&total_fee&, String.valueOf(total_fee)));
String sign = WXPay.genPackageSign(packageParams);
packageParams.add(new BasicNameValuePair(&sign&, sign));
return WXPay.toXml(packageParams);
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:352次
排名:千里之外支付宝代付以后产生交易退款怎么办
  支付宝代付付款成功后,如果交易产生了退款,款项会退回到代付申请人的支付宝账户。  目前除淘宝和阿里巴巴外,支持使用支付宝交易服务的商家已经超过46万家,涵盖了虚拟游戏、数码通讯、商业服务、机票等行业。这些商家在享受支付宝服务的同时,更是拥有了一个极具潜力的消费市场。  支付宝在电子支付领域稳健的作风、先进的技术、敏锐的市场预见能力及极大的社会责任感赢得银行等合作伙伴的认同。目前国内工商银行、农业银行、建设银行、招商银行、上海浦发银行等各大商业银行以及中国邮储、VISA国际组织等各大机构均和支付宝建立了深入的战略合作,不断根据用户需求推出创新产品,成为金融机构在电子支付领域最为信任的合作伙伴。  支付宝(中国)网络技术有限公司是国内领先的独立第三方支付平台,由集团创办。支付宝致力于为中国电子商务提供&简单、安全、快速&的在线支付解决方案。支付宝公司从2004年建立开始,始终以&信任&作为产品和服务的核心。不仅从产品上确保用户在线支付的安全,同时让用户通过支付宝在网络间建立起相互的信任,为建立纯净的互联网环境迈出了非常有意义的一步。  支付宝提出的建立信任,化繁为简,以技术的创新带动信用体系完善的理念,深得人心。在五年不到的时间内,用户覆盖了整个C2C、B2C、以及B2B领域。截止到日,支付宝注册用户达到2.5亿,日交易额超过12亿,日交易笔数达到500万笔。支付宝创新的产品技术、独特的理念及庞大的用户群吸引越来越多的互联网商家主动选择支付宝作为其在线支付体系。
最新更新栏目
您可能喜欢
大家都在搜当前位置: &
& 手机支付宝怎么退款进度教程
手机支付宝怎么退款进度教程
扫描二维码查看并分享给您的朋友
  手机支付宝怎么退款进度,接下来XP510小编为用户们介绍一下手机支付宝怎样退款进度一起来看看吧。
  手机支付宝如何退款进度教程:
  首先需要在你的手机上安装手机支付宝,根据你手机不同的版本选择安装对应的手机支付宝,并输入注册的支付宝用户名及登录密码进行登录;
  登录支付宝后,点击支付宝主界面右下侧的财富;
  点击进入财富页面后,你可以在支付宝界面的右上侧看到一个设置按钮,点击此按钮进入财富设置界面;
  进入财富设置页面后,然后点击打开服务大厅;
  进入服务大厅后,你可以查询付款及退款等相关问题,点击服务大厅右下侧的进度中心;
  进入服务大厅的进度中心后,在这里你可以看到你使用支付宝所进行的各项付款及退款业务进度情况;
  在服务大厅的进度中心中找到你需要查询的退款,单击打开对应的退款业务即可查看到退款的进度情况。
您看完本文的心情是:
看过本文的人还看过
3.45M | 简体中文
473M | 简体中文
1966.08M | 简体中文
2.08M | 简体中文
2.17M | 简体中文
111M | 简体中文
418.98M | 简体中文
235M | 简体中文
189M | 简体中文
注:您的评论需要经过审核才能显示哦,请文明发言!
本站资源均收集整理于互联网,其著作权归原作者所有,如果有侵犯您权利的资源,请来信告知,我们将及时撤销相应资源。
Copy . All Rights Reserved.}

我要回帖

更多关于 支付宝原路退款的接口 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信