• 千峰商城-springboot项目搭建-80-订单提交及支付-微信支付-商家注册(商户号)...


    通过微信平台为商家提供代收款服务。

    1.微信支付业务-商家注册微信支付业务

     2.申请支付订单-商户向支付平台申请支付链接

      支付订单并不是用户提交的商品订单,而是商户向微信支付平台申请的支付链接。

    (1)导入微信支付的依赖

     wxpay的maven依赖:
    1. <dependency>
    2. <groupId>com.github.wxpaygroupId>
    3. <artifactId>wxpay-sdkartifactId>
    4. <version>0.0.3version>
    5. dependency>
    1. //WXPayConfig对象表示商户信息WXPayConfig wxPayConfig = new WXPayConfig();//WxPay对象表示与微信支付平台进行交互的客户端WxPay wxPay = new WxPay(wxPayConfig);
    2. //data存放进行微信支付请求时的参数
    3. HashMap<String,String> data = new HashMap<>();
    4. data.put("fee_type","CNY"); //设置支付的币种:(CNY:人民币)
    data.put("total_fee","9980");    //设置支付的金额
    
    //......  
    
    //访问支付订单接口:向微信支付平台发送订单请求.Map<String,String> resp = wxPay.unfiedOrder(data); //resp表示微信平台返回的响应数据,支付链接就在这个map中。
    

    (2)创建微信支付配置类,配置商户信息

    创建一个类,实现WxPayConfig接口。

    重写三分方法,分别设置商户appID、商户ID、商户密钥。

    MyPayConfig :
    
    1. public class MyPayConfig implements WXPayConfig {
    2. @Override
    3. public String getAppID() {
    4. return "wx632c8f211f8122c6";
    5. }
    6. @Override
    7. public String getMchID() {
    8. return "1497984412";
    9. }
    10. @Override
    11. public String getKey() {
    12. return "balabalakey";
    13. }
    14. @Override
    15. public InputStream getCertStream() {
    16. return null;
    17. }
    18. @Override
    19. public int getHttpConnectTimeoutMs() {
    20. return 0;
    21. }
    22. @Override
    23. public int getHttpReadTimeoutMs() {
    24. return 0;
    25. }
    26. }

    (3)设置支付订单的参数

    OrderController :
    
    
    
    @RestController@CrossOrigin@RequestMapping("/order")@Api(value = "提供订单相关的操作接口",tags = "订单管理")public class OrderController { @Autowired private OrderService orderService; @PostMapping("/add") public ResultVO add(String cids,@RequestBody Orders order) { ResultVO resultVO = null; try { Map orderInfo = orderService.addOrder(cids,order); String orderId = orderInfo.get("orderId"); //String orderId="1234561234567"; if (order != null){ //微信支付:申请支付连接 WXPay wxPay = new WXPay(new MyPayConfig()); HashMap data = new HashMap<>(); data.put("body",orderInfo.get("productNames"));//商品描述 data.put("out_trade_no",orderId);//使用当前用户订单的编号作为当前用户订单的编号作为当前交易的交易号 data.put("fee_type","CNY");//支付币种 data.put("total_fee",order.getActualAmount()*100+"");//支付总金额(单位:分) data.put("trade_type","NATIVE");//交易类型 data.put("notify_url","/pay/success");//订单编号 //发送请求获取响应 Map resp = wxPay.unifiedOrder(data); System.out.println(resp); orderInfo.put("payUrl",resp.get("code_url")); resultVO = new ResultVO(ResStatus.OK,"提交订单成功!",orderInfo); }else { resultVO = new ResultVO(ResStatus.NO,"提交订单失败",null); } }catch (SQLException e){ resultVO = new ResultVO(ResStatus.NO,"提交订单失败",null); } catch (Exception e) { e.printStackTrace(); } return resultVO; }}
    
     
    

     PayController:

    1. @RestController
    2. @RequestMapping("/pay")
    3. public class PayController {
    4. @PostMapping("/success")
    5. public void success(){
    6. }
    7. }

     OrderService:

    1. public interface OrderService {
    2. public Map<String,String> addOrder(String cids, Orders order) throws SQLException;
    3. }
    OrderServiceImpl :
    
    1. @Service
    2. public class OrderServiceImpl implements OrderService {
    3. @Autowired
    4. private ShoppingCartMapper shoppingCartMapper;
    5. @Autowired
    6. private OrdersMapper ordersMapper;
    7. @Autowired
    8. private OrderItemMapper orderItemMapper;
    9. @Autowired
    10. private ProductSkuMapper productSkuMapper;
    11. //保存订单业务
    12. @Transactional//事务
    13. public Map<String,String> addOrder(String cids,Orders order) throws SQLException{
    14. Map<String,String> map = new HashMap<>();
    15. //1.根据cids查询当前订单中关联的购物车记录详情(包括库存)
    16. String[] arr = cids.split(",");
    17. List<Integer> cidsList = new ArrayList<>();
    18. for (int i=0; ilength;i++){
    19. cidsList.add(Integer.parseInt(arr[i]));
    20. }
    21. List<ShoppingCartVO> list = shoppingCartMapper.selectShopcartByCids(cidsList);
    22. //2.校验库存
    23. boolean f = true;
    24. String untitled = "";
    25. for (ShoppingCartVO sc:list){
    26. if (Integer.parseInt( sc.getCartNum() )>sc.getSkuStock()){
    27. f=false;
    28. //break;
    29. }
    30. //获取所有商品的名称,以“,”分割拼接成字符串
    31. untitled = untitled + sc.getProductName() + ",";
    32. }
    33. if (f){
    34. //3.表示用户充足----------保存订单
    35. order.setUntitled(untitled);
    36. order.setCreateTime(new Date());
    37. order.setStatus("1");
    38. //生成订单编号
    39. String orderId = UUID.randomUUID().toString().replace("-", "");
    40. order.setOrderId(orderId);
    41. //4.保存订单
    42. ordersMapper.insert(order);
    43. //if (i>0){
    44. //生成商品快照
    45. //List orderItems = new ArrayList<>();
    46. for (ShoppingCartVO sc:list){
    47. int cnum = Integer.parseInt(sc.getCartNum());
    48. String itemId = System.currentTimeMillis()+""+ (new Random().nextInt(89999)+10000 );
    49. OrderItem orderItem = new OrderItem(itemId, orderId, sc.getProductId(), sc.getProductName(), sc.getProductImg(),
    50. sc.getSkuId(), sc.getSkuName(),new BigDecimal(sc.getSellPrice()) , cnum,
    51. new BigDecimal(sc.getSellPrice() * cnum) , new Date(), new Date(), 0);
    52. //orderItems.add(orderItem);
    53. orderItemMapper.insert(orderItem);
    54. }
    55. //int j = orderItemMapper.insertList(orderItems);
    56. //5.扣减库存
    57. for (ShoppingCartVO sc:list){
    58. String skuId = sc.getSkuId();
    59. int newStock = sc.getSkuStock() - Integer.parseInt(sc.getCartNum());
    60. // Example example = new Example(ProductSku.class);
    61. // Example.Criteria criteria = example.createCriteria();
    62. // criteria.andEqualTo("skuId",skuId);
    63. // ProductSku productSku = productSkuMapper.selectByPrimaryKey(skuId);
    64. // //ProductSku productSku = new ProductSku();
    65. // productSku.setStock(newStock);
    66. // int k = productSkuMapper.updateByPrimaryKey(productSku);
    67. ProductSku productSku = new ProductSku();
    68. productSku.setSkuId(skuId);
    69. productSku.setStock(newStock);
    70. productSkuMapper.updateByPrimaryKeySelective(productSku);
    71. }
    72. //6.删除购物车:当购物车中的记录购买成功后,购物车对应做删除操作
    73. for (int cid:cidsList){
    74. shoppingCartMapper.deleteByPrimaryKey(cid);
    75. }
    76. map.put("orderId",orderId);
    77. map.put("productNames",untitled);
    78. return map;
    79. }else {
    80. //表示库存不足
    81. return null;
    82. }
    83. }
    84. }
     (4)测试(由于未申请微信商铺,所以返回的支付url未空)
  • 相关阅读:
    如何解决NSIS 2G文件的限制
    react-router基本使用
    ROS1云课→29如何借助ROS实现走迷宫机器人
    常用API类及异常体系
    制作网页头部固定悬浮的导航栏
    CSS Position与Float:探索布局的灵活性
    细胞焦亡+单细胞RNA测序联合分析,搭配实验验证,轻松发到5分+。
    8.30 - 面向对象的相关概念
    直流有刷电机转速、电流双闭环调速系统及Matlab/Simulink仿真分析
    程序验证Jackson反序列化的规则、Jackson序列化与反序列化关键方法程序详细分析
  • 原文地址:https://blog.csdn.net/LYly_B/article/details/126073956