小黑式烂代码之微信APP支付 + 退款(JAVA实现)

首先,你得先有微信开发平台账号密码还需要开通应用,然后还有微信服务商平台商户版账号(这些我都是给产品经理拿的)

其次我认为你先去看一看微信开发平台的文档!  https://pay.weixin.qq.com/wiki/doc/api/index.html

这里有很多种支付,我就采用APP支付来说了(会了APP支付其实H5支付都差不多的!)

进来后是这样的,随便看看‘APP支付那几篇文章‘讲的流程!,看完后知道大概了就可以看看‘API列表了‘

我们后台开发需要关注的就是这三个API了!

  1 /**
  2  * @description:微信支付: APP支付
  3  * @author:FanHaoJian
  4  */
  5 @Service
  6 public class WechatPayService {
  7     private static final Logger LOGGER = LoggerFactory.getLogger(WechatPayService.class);
  8
  9     /************ 微信开放平台配置  ***************/
 10
 11     /** APPID */
 12     private static final String APPID = "";
 13
 14     /** 商户号 */
 15     private static final String MCH_ID = "";
 16
 17     /** 密钥 */
 18     private static final String PRIVATE_KEY = "";
 19
 20     /** 用户订单支付结果异步通知url */
 21     private static final String NOTIFY_URL = "";
 22
 23     /** 商户支付证书路径 */
 24     private static final String API_CLIENT_CERT_PATH = "";
 25
 26     // 加载商户支付证书文件;
 27     static {
 28         LocalHttpClient.initMchKeyStore(MCH_ID, API_CLIENT_CERT_PATH);
 29     }
 30
 31     /**
 32      * @description:使用微信支付-APP支付方式-统一下单;
 33      * @return 支付参数,如果支付失败则返回null
 34      * @author:Fanhaojian
 35      */
 36     public MchPayApp orderAppPay(PayLog payLog) {
 37
 38         Unifiedorder unifiedorder = new Unifiedorder();
 39
 40         /** APPID */
 41         unifiedorder.setAppid(APPID);
 42
 43         /** 商户号 */
 44         unifiedorder.setMch_id(MCH_ID);
 45
 46         /** 随机字符串 */
 47         unifiedorder.setNonce_str(UUID.randomUUID().toString().replaceAll("-", ""));
 48
 49         /** 商品描述 */
 50         unifiedorder.setBody(payLog.getPayCode());
 51
 52         /** 商户订单号 */
 53         unifiedorder.setOut_trade_no(payLog.getPayCode());
 54
 55         /** 订单总金额 */
 56         unifiedorder.setTotal_fee(payLog.getPayPrice().multiply(new BigDecimal(100)).intValue() + "");   // 订单总金额,单位为分;
 57
 58         /** 用户端请求IP地址 */
 59         unifiedorder.setSpbill_create_ip(IpUtils.getClientIp());
 60
 61         /** 异步通知回调地址 */
 62         unifiedorder.setNotify_url(NOTIFY_URL);
 63
 64         /** 交易类型 */
 65         unifiedorder.setTrade_type("APP");
 66
 67         LOGGER.warn("微信APP支付--(签名前):" + XMLConverUtil.convertToXML(unifiedorder));
 68
 69         /** 获取签名 */
 70         UnifiedorderResult unifiedorderResult = PayMchAPI.payUnifiedorder(unifiedorder, PRIVATE_KEY);
 71
 72         LOGGER.warn("微信APP支付--支付统一下单接口请求状态(return_code):" + unifiedorderResult.getReturn_code());
 73         LOGGER.warn("微信APP支付--支付统一下单接口请求状态(return_msg):" + unifiedorderResult.getReturn_msg());
 74         LOGGER.warn("微信APP支付--支付统一下单接口请求状态(result_code):" + unifiedorderResult.getResult_code());
 75         LOGGER.warn("微信APP支付--支付请求参数封装(签名后):" + XMLConverUtil.convertToXML(unifiedorder));
 76         LOGGER.warn("微信APP支付--支付统一下单接口返回数据:" + FastJSONUtils.getJsonHelper().toJSONString(unifiedorderResult));
 77
 78         // 下单结果验签;
 79         if(unifiedorderResult.getSign_status() != null && unifiedorderResult.getSign_status()) {
 80             LOGGER.warn("微信APP支付验签成功");
 81             return PayUtil.generateMchAppData(unifiedorderResult.getPrepay_id(), APPID, MCH_ID, PRIVATE_KEY);
 82         }
 83         return null;
 84     }
 85
 86     /**
 87      * @description:微信退款业务封装(支付押金退还);
 88      * @param PayLog order:支付订单信息
 89      *           Double refundAmount:退款金额
 90      * @return 微信退款接口返回数据
 91      * @author:FanHaoJian
 92      */
 93     public Boolean refundOrder(PayLog order, Double refundAmount) {
 94
 95         // 调用微信支付退款接口;
 96         SecapiPayRefund payRefund = new SecapiPayRefund();
 97         payRefund.setAppid(APPID);
 98         payRefund.setMch_id(MCH_ID);
 99         payRefund.setNonce_str(UUID.randomUUID().toString().replaceAll("-", ""));
100         payRefund.setOut_trade_no(order.getPayCode());//支付订单号
101         payRefund.setOut_refund_no(order.getRefundCode());//退款单号
102         payRefund.setTotal_fee(order.getPayPrice().multiply(new BigDecimal(100)).intValue());//原订单金额,单位:分;
103         payRefund.setRefund_fee(new BigDecimal(refundAmount).multiply(new BigDecimal(100)).intValue());//退款订单金额,单位:分;
104
105         SecapiPayRefundResult refundResult = PayMchAPI.secapiPayRefund(payRefund, PRIVATE_KEY);
106
107         // 微信支付退款接口返回数据验签;
108         if(refundResult.getSign_status() != null && refundResult.getSign_status()) {
109             LOGGER.warn("微信退款接口--接口请求状态(return_code):" + refundResult.getReturn_code());
110             LOGGER.warn("微信退款接口--接口请求状态(return_msg):" + refundResult.getReturn_msg());
111
112             // 退款信息提交成功;
113             if("SUCCESS".equals(refundResult.getReturn_code())) {
114                 LOGGER.warn("微信退款接口--接口请求状态(result_code):" + refundResult.getResult_code());
115                 LOGGER.warn("微信退款接口--接口请求状态(err_code):" + refundResult.getErr_code());
116                 LOGGER.warn("微信退款接口--接口请求状态(err_code_des):" + refundResult.getErr_code_des());
117
118                 return Boolean.TRUE;
119             }
120         }
121
122         return Boolean.FALSE;
123     }
124 }

原文地址:https://www.cnblogs.com/xiaohei520/p/9146723.html

时间: 2024-10-19 15:41:09

小黑式烂代码之微信APP支付 + 退款(JAVA实现)的相关文章

微信APP支付(基于Java实现微信APP支付)

步骤: 导入maven依赖 <!--微信支付--> <dependency> <groupId>com.github.wxpay</groupId> <artifactId>wxpay-sdk</artifactId> <version>0.0.3</version> </dependency> 微信支付参数配置 import com.github.wxpay.sdk.WXPayConfig; im

微信APP支付(Java后台生成签名具体步骤)

public class PayCommonUtil { //定义签名,微信根据参数字段的ASCII码值进行排序 加密签名,故使用SortMap进行参数排序 public static String createSign(String characterEncoding,SortedMap<String,String> parameters){ StringBuffer sb = new StringBuffer(); Set es = parameters.entrySet(); Itera

微信app支付python代码实现

微信app支付python代码(使用weixin-python==0.5.4) 微信app支付python代码(python2) python3应该差不多, 官方文档: https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_1 业务流程: 商户系统和微信支付系统主要交互说明: #步骤1:用户在商户APP中选择商品,提交订单,选择微信支付. 用户在app页面选择商品,确定数量,提交订单,提供必要的参数 app支付需要的前端参数 1

微信App支付(JAVA端)

low话不多说,直接上代码! 红色框框是核心jar包! 黑色框框是获取客户端的IP地址工具类! 紫色框框是微信支付的流程代码! 蓝色框框是订单实体类! 由于小黑我技术不咋地,所以以下代码仅供参考,copy过去后是跑不起来的,不过可以经过改动代码使其跑起来,反正思路是这样的! (代码处如有发现错误的自行矫正修改,例如没有对事务控制,逻辑有误等!! 还有,大神看也,不喜勿喷) 此处代码就是用来调用微信支付SDK的,然后SDK会返回几个参数,这几个参数就是给APP端(IOS/安卓)调起支付的参数!! 

微信app支付android客户端以及.net服务端实现

由于公司运营需要,需要在客户端(android/ios)增加微信以及支付宝支付,在调用微信app支付时遇到一些问题,也算是一些踩过的坑,记录下来 ,希望能对.net开发者服务端网站更快的集成微信app支付. 1.开发所需资料:微信开放平台应用的appid以及appsecert,商户平台的商户号以及api安全里面里面设置的key,详见 微信支付账户相关信息; 2.微信开发者平台完善应用平台的相关信息,android应用签名必须用打包签名过的发布版本apk(这一步很重用),包名必须一致,可以用微信提

微信app支付php开发

前几天做微信app支付,遇到了支付失败的问题,app进行支付的时候,返回-1.查了好多资料,没找到.后来经过排查,是因为签名的问题.不多说,直接上代码.服务器端的demo版本是v3. require(dirname(dirname(__FILE__))."/lib/WxPay.Api.php");            //生成订单            $out_trade_no = trim($_POST['orderid']);            //总金额(1表示1分钱) 

关于被微信App支付坑的过程

最近因为项目要接入微信App支付(没做过,不了解),然后就开网上一番狂搜+看官方文档,那是一个乱七八糟. 微信在2014年9月10号更新出了v3的版本,结果我竟然拿着v2版本在那里调试=>被坑. 回归到正题:希望接下来的朋友少走一些弯路. 微信总共有三个平台: 公众号平台:https://mp.weixin.qq.com/ 商户平台:https://pay.weixin.qq.com 开放平台:https://open.weixin.qq.com/ 这里所提到的微信App支付则是用到开放平台.

微信app支付(android端+java后台)

本文讲解使用微信支付接口完成在android开发的原生态app中完成微信支付功能, 文章具体讲解了前端android如何集成微信支付功能以及后台如何组装前端需要支付信息, 话不多话, 具体看文章内容吧00:00 / 07:03正常 本实例项目运行条件: 开发环境: [Android Studio] 到微信开放平台注册帐号并且创建移动应用 https://open.weixin.qq.com/cgi-bin/frame?t=home/app_tmpl&lang=zh_CN Column 1 Col

.Net后台实现微信APP支付

上一节分享了微信小程序支付的后台,这一节来分享一下微信APP支付的后台.微信APP支付和微信小程序差别不大,微信APP支付后台不需要微信登录凭证.后台下单时交易类型(trade_type)不再是"JSAPI",而是"APP".商户后台传递给支付端的下单参数也有所不同.由于微信小程序支付和APP支付使用的APPID不同,索性直接写了两套支付,不再在代码里区分究竟该使用小程序支付的配置参数还是APP支付的参数. 官方是这样介绍的 具体实现: 新建AppPayConfig