java微信APP支付v3版服务端开发
2017-03-30 20:14
726 查看
先在微信开发平台注册并认证开发者账号,创建一个APP应用,申请支付功能,创建商户平台账号
开始开发
配置Configure文件
APPID就是微信开放平台审核通过的应用APPID
key是https://pay.weixin.qq.com/index.php/core/cert/api_cert里的API秘钥
最多最多只能三十二位
CERTLOCALPATH 先访问https://pay.weixin.qq.com/index.php/core/cert/api_cert 下载证书 java需要.p12的
CERTPASSWORD是商户号
下面是部分代码
统一下单代码
查询支付订单代码
微信回调代码
统一调用类
部分业务引用代码
代码下载http://download.csdn.net/detail/sourny/9801156
如果有不懂得地方可以给我留言
开始开发
配置Configure文件
APPID就是微信开放平台审核通过的应用APPID
key是https://pay.weixin.qq.com/index.php/core/cert/api_cert里的API秘钥
最多最多只能三十二位
CERTLOCALPATH 先访问https://pay.weixin.qq.com/index.php/core/cert/api_cert 下载证书 java需要.p12的
CERTPASSWORD是商户号
下面是部分代码
统一下单代码
public class UnifiedOrderService extends BaseService{ private static Logger logger = LoggerFactory.getLogger(UnifiedOrderService.class); public UnifiedOrderService() throws ResponseException { try { httpsRequestService = new HttpsRequestService(Configure.UNIFIED_ORDER_URI); } catch (Exception e) { logger.error("初始化orderService失败{},{}", e.getMessage(), e); throw new ResponseException(ResponseCode.ERROR_000001); } } private HttpsRequestService httpsRequestService; /** * app下单 * @param orderReqData * @return * @throws ResponseException * @author sourny * @data 2017年4月1日 */ public Map<String, Object> createAppOrder(UnifiedOrderReqData orderReqData) throws ResponseException { logger.info("微信支付创建预支付订单------>"); // 接受API返回 String payServiceResponseString = ""; long costTimeStart = System.currentTimeMillis(); try { payServiceResponseString = httpsRequestService.sendPost(orderReqData); } catch (Exception e) { logger.error("【微信创建支付订单失败】请求支付API系统失败"); throw new ResponseException(ResponseCode.ERROR_000002); } long costTimeEnd = System.currentTimeMillis(); logger.info("api请求总耗时:{}ms", costTimeEnd - costTimeStart); // 打印回包数据 logger.info("微信API返回的数据:{}", payServiceResponseString); // 将从API返回的XML数据映射到Java对象 UnifiedOrderResData resData = (UnifiedOrderResData) XMLParser.getObjectFromXML(payServiceResponseString, UnifiedOrderResData.class); Map<String, Object> map = new HashMap<String, Object>(); processResString(resData, payServiceResponseString, new ProcessEventInterface() { @Override public void processSuccessEvent() { logger.info("【微信创建支付订单成功】开始给返回app参数加签"); map.put("appid", resData.getAppid()); map.put("partnerid", resData.getMch_id()); map.put("prepayid", resData.getPrepay_id()); map.put("package", "Sign=WXPay"); map.put("noncestr", RandomStringGenerator.getRandomStringByLength(32)); map.put("timestamp", (Calendar.getInstance().getTimeInMillis() / 1000) + ""); Wxsign.buildRequestPara(map); logger.info("【微信创建支付订单成功】app参数加签完成:{}", map); } }); logger.info("<------微信支付创建预支付订单"); return map; } }
查询支付订单代码
public class OrderQueryService extends BaseService { private static Logger logger = LoggerFactory.getLogger(OrderQueryService.class); public OrderQueryService() throws ResponseException { try { httpsRequestService = new HttpsRequestService(Configure.ORDER_QUERY_URI); } catch (Exception e) { logger.error("初始化orderService失败{},{}", e.getMessage(), e); throw new ResponseException(ResponseCode.ERROR_000001); } } private HttpsRequestService httpsRequestService; /** * 查询订单 * @param queryReqData * @return * @throws ResponseException * @author sourny * @data 2017年4月1日 */ public OrderQueryResData queryOrder(OrderQueryReqData queryReqData) throws ResponseException { logger.info("微信支付查询支付订单------>"); // 接受API返回 String queryResponseString = ""; long costTimeStart = System.currentTimeMillis(); try { queryResponseString = httpsRequestService.sendPost(queryReqData); } catch (Exception e) { logger.error("【微信支付查询订单失败】请求支付API系统失败"); throw new ResponseException(ResponseCode.ERROR_000007); } long costTimeEnd = System.currentTimeMillis(); logger.info("api请求总耗时:{}ms", costTimeEnd - costTimeStart); // 打印回包数据 logger.info("微信API返回的数据:{}", queryResponseString); // 将从API返回的XML数据映射到Java对象 OrderQueryResData resData = (OrderQueryResData) XMLParser.getObjectFromXML(queryResponseString, OrderQueryResData.class); processResString(resData, queryResponseString, new ProcessEventInterface() { @Override public void processSuccessEvent() { // TODO Auto-generated method stub } }); logger.info("<------微信支付查询支付订单"); return resData; } }
微信回调代码
public class NotifyService extends BaseService { private static Logger logger = LoggerFactory.getLogger(NotifyService.class); public NotifyResData checkNotify(String xml) throws ResponseException { logger.info("微信支付通知返回参数:{}", xml); logger.info("微信支付通知检查参数------>"); NotifyResData reqData = (NotifyResData) XMLParser.getObjectFromXML(xml, NotifyResData.class); processResString(reqData, xml, new ProcessEventInterface() { @Override public void processSuccessEvent() { // TODO Auto-generated method stub } }); logger.info("<------微信支付通知检查参数通过"); return reqData; } }baseService代码
public class BaseService { private static Logger logger = LoggerFactory.getLogger(BaseService.class); /** * 验证签名 * * @param resData * 转换后的xml对象 * @param responseString * 返回的String * @param p * 校验成功后处理模板 * @throws ResponseException * @author sourny * @data 2017年3月31日 */ protected void processResString(BaseResData resData, String responseString, ProcessEventInterface p) throws ResponseException { logger.info("resData:{}", resData); if (resData == null || resData.getReturn_code() == null) { // logger.error("【微信支付查询订单失败】请求逻辑错误,请仔细检测传过去的每一个参数是否合法,或是看API能否被正常访问"); throw new ResponseException(ResponseCode.ERROR_000010); } if (resData.getReturn_code().equals("FAIL")) { // 注意:一般这里返回FAIL是出现系统级参数错误,请检测Post给API的数据是否规范合法 // logger.error("【微信支付查询订单失败】API系统返回失败,请检测Post给API的数据是否规范合法"); throw new ResponseException(ResponseCode.ERROR_000011); } else { logger.info("支付API系统成功返回数据"); // -------------------------------------------------------------------- // 收到API的返回数据的时候得先验证一下数据有没有被第三方篡改,确保安全 // -------------------------------------------------------------------- if (!Wxsign.checkIsSignValidFromResponseString(responseString)) { // logger.error("【微信支付查询订单失败】请求API返回的数据签名验证失败,有可能数据被篡改了"); throw new ResponseException(Response d055 Code.ERROR_000012); } // 获取错误码 String errorCode = resData.getErr_code(); // 获取错误描述 String errorCodeDes = resData.getErr_code_des(); if (resData.getResult_code().equals("SUCCESS")) { logger.info("【微信支付】返回参数校验成功开始执行成功方法--->"); p.processSuccessEvent(); } else { // 出现业务错误 logger.error("业务返回失败err_code:{},err_code_des:{}", errorCode, errorCodeDes); throw new ResponseException(ResponseCode.ERROR_000013); } } } public interface ProcessEventInterface { /** * 校验成功触发事件 * * @author sourny * @data 2017年3月31日 */ void processSuccessEvent(); } }
统一调用类
/** * SDK总入口 */ public class WXPay { /** * 初始化SDK依赖的几个关键配置 * * @param key * 签名算法需要用到的秘钥 * @param appID * 公众账号ID * @param mchID * 商户ID * @param sdbMchID * 子商户ID,受理模式必填 * @param certLocalPath * HTTP证书在服务器中的路径,用来加载证书用 * @param certPassword * HTTP证书的密码,默认等于MCHID */ public static void initSDKConfiguration(String key, String appID, String mchID, String sdbMchID, String certLocalPath, String certPassword) { //如果有多个就可以通过init方法进行配置 /* * Configure.setKey(key); Configure.setAppID(appID); * Configure.setMchID(mchID); Configure.setSubMchID(sdbMchID); * Configure.setCertLocalPath(certLocalPath); * Configure.setCertPassword(certPassword); */ } /** * 创建APP预付订单 * @param orderReqData * @return * @throws ResponseException * @author sourny * @data 2017年3月30日 */ public static Map<String, Object> createOrder(UnifiedOrderReqData orderReqData) throws ResponseException { return new UnifiedOrderService().createAppOrder(orderReqData); } /** * 校验app支付异步通知 * @param xml * @return * @throws ResponseException * @author sourny * @data 2017年3月30日 */ public static NotifyResData checkAppNotify(String xml) throws ResponseException { return new NotifyService().checkNotify(xml); } public static OrderQueryResData queryOrder(OrderQueryReqData queryReqData) throws ResponseException{ return new OrderQueryService().queryOrder(queryReqData); } }
部分业务引用代码
logger.info("开始为支付订单设值--->"); PaymentOrder paymentOrder = setPaymentOrder(PaymentMethod.WEIXIN.value, PaymentDevice.APP.value, payVO); logger.info("完成支付订单设值:{}" + paymentOrder); logger.info("-----开始保存支付订单信息-----"); paymentOrderService.save(paymentOrder); logger.info("-----完成保存支付订单信息-----"); //构建统一下单请求参数 UnifiedOrderReqData order = new UnifiedOrderReqData(paymentOrder.getSubject(), paymentOrder.getPkId(), paymentOrder.getMoney(), paymentOrder.getClientIp(), 30, Configure.NOTIFY_URL, Configure.TRADE_TYPE_APP); Map<String, Object> map = new HashMap<String, Object>(); map = WXPay.createOrder(order); return new Response<Map<String, Object>>(map);
代码下载http://download.csdn.net/detail/sourny/9801156
如果有不懂得地方可以给我留言
相关文章推荐
- Java服务端接入支付宝APP支付及微信APP支付
- 微信APP支付Java服务端
- java支付宝和微信app支付(服务端处理)
- 微信支付 java 服务端demo (v3版本app支付 springMVC框架中)
- 微信支付 java 服务端demo (v3版本app支付 springMVC框架中)
- java服务端–微信APP支付接口
- java服务端–微信APP支付接口
- 微信APP支付服务端(JAVA)
- 微信支付 java 服务端demo (v3版本app支付 springMVC框架中)
- java服务端微信APP支付接口详解
- 微信APP支付服务端(JAVA)
- java实现微信App支付服务端
- 微信支付 java 服务端demo (v3版本app支付 springMVC框架中)
- java服务端–微信APP支付接口
- 微信扫码支付第一种场景(先生成产品二维码,用户扫码生成交易)JAVA开发总结
- 微信APP支付(Java后台生成签名具体步骤)
- java版微信App支付--下单
- java进行微信h5支付开发
- Android开发微信APP支付功能的要点小结
- 微信支付——调用微信客户端支付之【服务端】开发详解