304-309

主要对支付宝的开放平台对接的使用,验签收单有了一定的连接。

视频中的nginx配置:

我没有动这块,还是走的阿里云:

代码具体如下:

@ConfigurationProperties(prefix = "alipay")
@Component
public class AlipayTemplate {// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号public static String app_id = "2021000116667682";// 商户私钥,您的PKCS8格式RSA2私钥public static String merchant_private_key = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQClo7YKk8lnuHsKe4aOLmNd/vCRZ5ia8kpxvSR9iy1REkpfVV1cV1TqQlSj3OZ62PtoHDNbCbgp01gUxe/96PwObjpWudxtVklf8YifTFWPafed0q0blEBayzXt26tX8H/Uxd0oKFmdh+VYLDJ6or3qPfrhd8f298v1Ijrc1ituAgTsHybQ946WpnE+JhTAmCinzxeDrXAOZ96WDyaZB7hxPKu+AvLEU/RJIxKLXyVN51rEeI+kYDNQvscs/8WVXN0Qldkd1bXnB5RpOeEl7D7Q7ZasK4Q9vRnSw1Yu1vtWv5HlUgopfCweix+wkIWK/dFTfF5i5KW0etXJc38vCLw9AgMBAAECggEAOCtcABo9oj6c+uEIsA5rA+UAD07iISkotYk+ZpRbubJKJin8juPOl+IGccrnHaGXH6bwg164ZPaWV/UHfUMUtpAKmH5OkYVBPJfbjKmGGiwFHC/lJAUSDbf7gb2MTTXxI2Y1qPiF6zW6QDw8ofmuDVEXUn4cAVPmhiola930vEjGdCFvY1vTOFw64fECAnE8/zkEF98byluE3DqSFZmUQfMeuu0LYwMcVCiv+qXmBH/I5ojOfXCHkbzUPYCE0OIg4Agu1QMlkA6YXn0d4KW7nrME1BUC2UJTNFsJwP5wg5hWiNOEab8vlsYKIIiFPlO0+VFUWAXPz6IaEFjSMaFewQKBgQDmmZvrLP3QFF3HeE74yKymvM5OOjP1ovKde7jko2fZPUmJst6ef4/VI39BHLTWS/IHc9OpufPfFrObgf2vbaLvc+xzQcz5EeuH+haYYIF6PFLAvhpl6+nv8BNh8nlZjr7GCqOqKR+gfPfJHakA2q1H2if1c4HLsyTgUc2VurxcOwKBgQC34l05vgSK2vDlgj9haWohtJBSZl+iHuMb9+Df6Dhc81ugUKx1QjQApyYTAaxUDGWY6NxQ7NSWjO4qcXM5KDL/GJhFRRC5qZDNERQ2jPpieqIq0BiYWYGOn57V3wNOFU8xk8rKMVhiGATcHpPG9bHP6a7uQ65TlX7DTuImhfNZ5wKBgQCPtEBXQXV2m4qJiO7l2ODHE7gZReoldINvIq/pQ++ukKPoPODAs0vmDjX6VLJZLYDJpiPMjIZuiw4opcx6637zbDF47hOXT9SQq4gzM0jc7QTA+ncm9uqVTO43Rszaw7sdXXn6y5/a+qXL3kD4uE3uDgSC0JWdZKlhZXkRiwphCwKBgQC2GYii9yc+b0Vis5KaoC8HQ+4se883GIlmGBrtAeZXPnS9lUbENJSVFPJiniSPc1tliy0rQu3gTZ5KD+HAd6vQ7gVVi+jdRCvuuHwg7YnD3pgb98pzjSf9GtvMBrcaK4YqnaaUhzt0oT6m0e0cehHlyRCASiwoAALx3XueFMcCfwKBgQCrFBEOO04bWDX0pTrA2OU8FtvoXAUl2ji3FOXC4sUxgFnT9dFw/PlpGtx9DjYcspvHC+cNAYkxAUepePXkZbj8SSOgHjsdKouSM+Nwo9+93DGN29YUO6l6AIt6IPxXvSGUTQUCPlBQ2A1y4YFEjg5uxu85u3AYqa6a4qYTVMFKeQ==";// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。public static String alipay_public_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkTof8EkrceHNaJcuqPx7aAUFPJ1X3WBwf9wDgPlQ2U/lnNCd6z196azAYpR9WJSqZv9iJY9TFVBIr+XHr4hFsdIgyb3ZkH6MIs3x2yahMij+3msUY34NQkrz3S90Fb1FfTFYoANOxwhP2Q7QyfNyJkZgcVvCnf66lsGt/E1eXxUP8xpVcHUgWVHp+orGlMXkGsC8XuHcTTFCAdhA+NHHjDCPLOJ1cWcqDjmSk8WqH+FGEvGt+HwiNxZvImoa4+4CIwlwAv+CayRgjvpqk6H50KNkTP54AVgR1DYCs6nqvoGuj6V+mlEisT9U1Rl5XJxX6JPg0ddGq1rDdFh+wGRM/wIDAQAB";// 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问public static String notify_url = "http://47.110.91.150/payed/notify";// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问public static String return_url = "http://member.gulimall.com/memberOrder.html";// 签名方式public static String sign_type = "RSA2";// 字符编码格式public  static String charset = "utf-8";// 支付宝网关public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";public  String pay(PayVo vo) throws AlipayApiException {//AlipayClient alipayClient = new DefaultAlipayClient(AlipayTemplate.gatewayUrl, AlipayTemplate.app_id, AlipayTemplate.merchant_private_key, "json", AlipayTemplate.charset, AlipayTemplate.alipay_public_key, AlipayTemplate.sign_type);//1、根据支付宝的配置生成一个支付客户端AlipayClient alipayClient = new DefaultAlipayClient(gatewayUrl,app_id, merchant_private_key, "json",charset, alipay_public_key, sign_type);//2、创建一个支付请求 //设置请求参数AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();alipayRequest.setReturnUrl(return_url);alipayRequest.setNotifyUrl(notify_url);//商户订单号,商户网站订单系统中唯一订单号,必填String out_trade_no = vo.getOut_trade_no();//付款金额,必填String total_amount = vo.getTotal_amount();//订单名称,必填String subject = vo.getSubject();//商品描述,可空String body = vo.getBody();alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","+ "\"total_amount\":\""+ total_amount +"\","+ "\"subject\":\""+ subject +"\","+ "\"body\":\""+ body +"\","+ "\"timeout_express\":\"1m\","+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");String result = alipayClient.pageExecute(alipayRequest).getBody();//会收到支付宝的响应,响应的是一个页面,只要浏览器显示这个页面,就会自动来到支付宝的收银台页面System.out.println("支付宝的响应:"+result);return result;}
}

进行验签:

/*** @author WGR* @create 2020/8/13 -- 0:03*/
@RestController
public class OrderPayedListener {@AutowiredOrderService orderService;@PostMapping("/payed/notify")@SneakyThrowspublic String handleAlipayed(PayAsyncVo vo, HttpServletRequest request){
//        Map<String, String[]> parameterMap = request.getParameterMap();
//        for (String key : parameterMap.keySet()){
//            String value = request.getParameter(key);
//            System.out.println("参数名:"+key+"==>参数值:"+value);
//        }//获取支付宝GET过来反馈信息Map<String,String> params = new HashMap<String,String>();Map<String,String[]> requestParams = request.getParameterMap();for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {String name = (String) iter.next();String[] values = (String[]) requestParams.get(name);String valueStr = "";for (int i = 0; i < values.length; i++) {valueStr = (i == values.length - 1) ? valueStr + values[i]: valueStr + values[i] + ",";}//乱码解决,这段代码在出现乱码时使用// valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");params.put(name, valueStr);}boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayTemplate.alipay_public_key, AlipayTemplate.charset, AlipayTemplate.sign_type); //调用SDK验证签名//——请在这里编写您的程序(以下代码仅作参考)——if(signVerified) {System.out.println("验签成功");String reuslt =  orderService.handlePayResult(vo);return reuslt;}else {System.out.println("验签失败");return "error";}}
}

需要放行:

@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String uri = request.getRequestURI();AntPathMatcher antPathMatcher = new AntPathMatcher();boolean match = antPathMatcher.match("/order/order/status/**", uri);boolean match1 = antPathMatcher.match("/payed/notify", uri);if(match || match1){return true;}MemberRespVo attribute = (MemberRespVo)request.getSession().getAttribute(AuthServerConstant.LOGIN_USER);if(attribute !=null){loginUser.set(attribute);return true;}else{request.getSession().setAttribute("msg","请先进行登录");response.sendRedirect("http://auth.gulimall.com/login.html");return false;}}
@Overridepublic String handlePayResult(PayAsyncVo vo) {//1.保存交易流水PaymentInfoEntity infoEntity = new PaymentInfoEntity();infoEntity.setAlipayTradeNo(vo.getTrade_no());infoEntity.setOrderSn(vo.getOut_trade_no());infoEntity.setPaymentStatus(vo.getTrade_status());infoEntity.setCallbackTime(vo.getNotify_time());paymentInfoService.save(infoEntity);//2.修改订单的状态信息if(vo.getTrade_status().equals("TRADE_SUCCESS") || vo.getTrade_status().equals("TRADE_FINISHED")){String outTradeNo = vo.getOut_trade_no();this.baseMapper.updateOrderStatus(outTradeNo,OrderStatusEnum.PAYED.getCode());}return "success";}@Overridepublic PageUtils queryPageWithItem(Map<String, Object> params) {MemberRespVo memberRespVo = LoginUserInterceptor.loginUser.get();IPage<OrderEntity> page = this.page(new Query<OrderEntity>().getPage(params),new QueryWrapper<OrderEntity>().eq("member_id",memberRespVo.getId() ).orderByDesc("id"));List<OrderEntity> order_sn = page.getRecords().stream().map(order -> {List<OrderItemEntity> itemEntities = orderItemService.list(new QueryWrapper<OrderItemEntity>().eq("order_sn", order.getOrderSn()));order.setItemEntities(itemEntities);return order;}).collect(Collectors.toList());page.setRecords(order_sn);return new PageUtils(page);}

谷粒商城整合支付宝(四十五)相关推荐

  1. 【Visual C++】游戏开发笔记四十五 浅墨DirectX教程十三 深度测试和Z缓存专场

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8607864 作者:毛星云(浅墨 ...

  2. 谷粒商城检索服务(三十)

    谷粒商城检索服务(三十) 173.商城业务-检索服务-搭建页面环境 - 192.商城业务-检索服务-条件筛选联动 敲完代码,感觉ES的复杂查询还不是很熟练,不过应用的也比较简单,权重和分词都没有应用到 ...

  3. Python编程基础:第四十五节 方法链Method Chaining

    第四十五节 方法链Method Chaining 前言 实践 前言 方法链是指一个对象一次调用其自身的多个方法,通常写作对象.方法1.方法2.由于这种调用方法看起来像一个链条,所以我们将其称作方法链. ...

  4. 四十五、深入Java的网络编程(上篇)

    @Author:Runsen @Date:2020/6/8 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  5. [系统安全] 四十五.APT系列(10)Metasploit后渗透技术信息收集、权限提权和功能模块详解

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  6. NeHe OpenGL教程 第四十五课:顶点缓存

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  7. JavaScript学习(四十五)—练习题

    JavaScript学习(四十五)-练习题 习题1 习题2:

  8. 服务器存储满了进不去系统,解决PC常见问题 篇四十五:建议收藏!手贱升级进不去系统?两步简单恢复黑群晖!...

    解决PC常见问题 篇四十五:建议收藏!手贱升级进不去系统?两步简单恢复黑群晖! 2021-07-19 16:40:32 47点赞 302收藏 15评论 创作立场声明:本文属于原创文章,无任何利益关系, ...

  9. 40岁想在职读计算机博士,年龄超过四十五岁还有机会报考在职博士吗

    我国一直都在强调"活到老,学到老",所以我国正在向学习型社会发展.因此,我们每一个人都要树立终身学习的理念,只有让自己不断的进步,才不会被快速发展的社会所淘汰.有很多人想要报考在职 ...

最新文章

  1. javaScript小问题,托拽元素,获得当前鼠标的坐标
  2. DDoS***、CC***的***方式和防御方法
  3. go mod tidy 下载依赖包问题
  4. unicode字符串操作函数 vc
  5. JVM 运行时数据区详解,写得非常好!
  6. 中油即时通信电脑版_联想超智能电脑横空出世 电脑适应人已成现实
  7. CoordinatorLayout使用全解析
  8. 思科交换机开机后显示switch:
  9. pythonpandas重复数据统计_python – 连续的pandas数据帧之间的重复计算
  10. Atitit mybatis缓存遇到的问题与解决 1.1. 只有getobj 没有执行putobject 1 1.2. 默认所有的select要读取缓存怎么办。。执行过滤 可以自己定义个白名单。
  11. 查看和修改mysql最大连接数
  12. laravel实战项目之管理员表设计
  13. android recycleView嵌套recycleView下拉二级列表显示(带动画)
  14. 移动WEB开发布局中的-box-sizing:border-box
  15. bzoj1754[Usaco2005 qua]Bull Math*
  16. 新用户域名实名认证教程---金万维
  17. 基于python实现resnet_【Tensorflow系列】使用Inception_resnet_v2训练自己的数据集并用Tensorboard监控...
  18. 实战分享|作为AI小白,如何争取AI产品经理offer
  19. 静态库和动态库的制作使用与区别
  20. ASP.NET Core MVC 中的模型验证

热门文章

  1. sparkmllib关联规则算法(FPGrowth,Apriori)
  2. 除LinkedIn之外,微软的五大收购案
  3. 新手学习Linux之快速上手分析
  4. 编译recovery及过程中的部分错误解决
  5. 【Android -- 开源库】SmartRefreshLayout 的基本使用
  6. Nodejs学习---总结篇
  7. 知网查重专有名词过长怎么办
  8. JAVA零基础学习之路(三十)
  9. python用hist参数解读
  10. 使用DOCKER部署Wordpress服务器