网络上建个网站买东西多少钱,服务器更改wordpress,腾讯云服务器优惠,百度网站认证目录
Nuxt.js IP 启动
支付回调
回调接口
后端实现
查看支付状态
后端实现
前端实现
前置技术#xff1a;RabbitMQ
更新订单状态
Nuxt.js IP 启动 config: {nuxt: {host: 0.0…目录
Nuxt.js IP 启动
支付回调
回调接口
后端实现
查看支付状态
后端实现
前端实现
前置技术RabbitMQ
更新订单状态
Nuxt.js IP 启动 config: {nuxt: {host: 0.0.0.0,port: 3000}},
支付回调
回调接口 步骤一修改yml文件添加notifyUrl配置
步骤二修改配置文件
步骤三修改工具类 步骤一修改yml文件添加notifyUrl配置 sc:pay:notifyUrl: http://40m459492i.wicp.vip/order-service/pay/callback
步骤二修改配置文件 private String notifyUrl; //回调路径
步骤三修改工具类 package com.czxy.changgou4.utils;import com.czxy.changgou4.config.PayProperties;
import com.github.wxpay.sdk.WXPay;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;import java.util.HashMap;
import java.util.Map;/*** author 桐叔* email liangtongitcast.cn*/
Component
EnableConfigurationProperties(PayProperties.class)
public class PayHelper {private WXPay wxPay;private PayProperties payProperties;Beanpublic WXPay wxPay(PayProperties payProperties){if(wxPay null){this.payProperties payProperties;wxPay new WXPay(payProperties);}return wxPay;}private static final Logger logger LoggerFactory.getLogger(PayHelper.class);public PayHelper() {}public PayHelper(PayProperties payProperties) {wxPay new WXPay(payProperties);}public String createPayUrl(Long sn) {String key pay.url. sn;try {MapString, String data new HashMap();// 商品描述data.put(body, 商城测试);// 订单号data.put(out_trade_no, sn.toString());//货币data.put(fee_type, CNY);//金额单位是分data.put(total_fee, 1);//调用微信支付的终端IP商城的IPdata.put(spbill_create_ip, 127.0.0.1);//回调地址data.put(notify_url, this.payProperties.getNotifyUrl());// 交易类型为扫码支付data.put(trade_type, NATIVE);//商品id,使用假数据data.put(product_id, 1234567);MapString, String result this.wxPay.unifiedOrder(data);if (SUCCESS.equals(result.get(return_code))) {if(SUCCESS.equals(result.get(result_code))){String url result.get(code_url);return url;} else {logger.error(创建预交易订单失败错误信息{}, result.get(err_code_des));return null;}} else {logger.error(创建预交易订单失败错误信息{}, result.get(return_msg));return null;}} catch (Exception e) {logger.error(创建预交易订单异常, e);return null;}}/*** 查询订单状态* 交易状态参考(trade_state)SUCCESS—支付成功REFUND—转入退款NOTPAY—未支付CLOSED—已关闭REVOKED—已撤销付款码支付USERPAYING--用户支付中付款码支付PAYERROR--支付失败(其他原因如银行返回失败)* param sn* return*/public PayState queryOrder(Long sn) {MapString, String data new HashMap();// 订单号data.put(out_trade_no, sn.toString());try {MapString, String result this.wxPay.orderQuery(data);if(SUCCESS.equals(result.get(return_code))){if(SUCCESS.equals(result.get(result_code))) {String tradeState result.get(trade_state);if (SUCCESS.equals(tradeState)) {return PayState.SUCCESS;}if (NOTPAY.equals(tradeState)) {return PayState.NOT_PAY;}if (CLOSED.equals(tradeState)) {return PayState.CLOSED;}}}return PayState.PAY_ERROR;} catch (Exception e) {logger.error(查询订单状态异常, e);return PayState.PAY_ERROR;}}
}
后端实现 步骤一修改PayController添加callback方法步骤二检查网关放行callback方法步骤三修改花生壳访问10010端口 https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter9_7index8步骤一修改PayController添加callback方法
PostMapping(/callback)
public void callback(HttpServletRequest request, HttpServletResponse response) throws IOException {try {//1 获得响应内容String xml IOUtils.toString(request.getInputStream(), UTF-8);System.out.println(xml);//解析MapString, String map WXPayUtil.xmlToMap( xml );// 查询成功if(SUCCESS.equals(map.get( result_code ) )){// 获得订单号String sn map.get(out_trade_no);//TODO 更新订单状态System.out.println(sn);//如果成功给微信支付一个成功的响应response.setContentType(text/xml);String data xmlreturn_code![CDATA[SUCCESS]]/return_codereturn_msg![CDATA[OK]]/return_msg/xml;response.getWriter().write(data);}} catch (Exception e) {e.printStackTrace();response.setContentType(text/xml);String data xmlreturn_code![CDATA[FAIL]]/return_codereturn_msg![CDATA[e.getMessage()]]/return_msg/xml;response.getWriter().write(data);}
}步骤二检查网关放行callback方法 步骤三修改花生壳访问10010端口 查看控制台结果
xmlappid![CDATA[wx8397f8696b538317]]/appid
bank_type![CDATA[COMM_CREDIT]]/bank_type
cash_fee![CDATA[1]]/cash_fee
fee_type![CDATA[CNY]]/fee_type
is_subscribe![CDATA[N]]/is_subscribe
mch_id![CDATA[1473426802]]/mch_id
nonce_str![CDATA[47e529ea929e4c9e847ee9699751a648]]/nonce_str
openid![CDATA[oNpSGwZaaw_0uBEMwFpkwIwFsttw]]/openid
out_trade_no![CDATA[1259484402174529500]]/out_trade_no
result_code![CDATA[SUCCESS]]/result_code
return_code![CDATA[SUCCESS]]/return_code
sign![CDATA[2D4BC610795C1DC303B0B26092D6C6E3]]/sign
time_end![CDATA[20200510220429]]/time_end
total_fee1/total_fee
trade_type![CDATA[NATIVE]]/trade_type
transaction_id![CDATA[4200000568202005108477965385]]/transaction_id
/xml
1259484402174529500
查看支付状态 后端实现
步骤一修改PayService查询订单支付状态步骤二编写PayService实现类步骤三修改PayController 步骤一修改PayService查询订单支付状态
package com.czxy.changgou4.service;import com.czxy.changgou4.utils.PayState;
import com.czxy.changgou4.vo.PayRequest;/*** author 桐叔* email liangtongitcast.cn*/
public interface PayService {/*** 查看支付状态* param sn* return*/public PayState query(Long sn);
}
步骤二编写PayService实现类
Override
public PayState query(Long sn) {//查询微信支付状态PayState payState payHelper.queryOrder(sn);return payState;}步骤三修改PayController
GetMapping(/{sn})
public BaseResult query(PathVariable(sn) Long sn){//查询PayState payState payService.query(sn);//返回if(payState.getCode() 1) {return BaseResult.ok(payState.getDesc());}return BaseResult.error(payState.getDesc());
}
前端实现
如果订单已经支付跳转到支付成功页面。 步骤一修改api.js查询订单支付状态步骤二修改flow3“查询订单状态”绑定事件步骤三修改flow3编写事件如果是成功调到到flow4步骤四编写flow4与flow3基本内容一致提示信息为“支付成功货物即将送出” 步骤一修改api.js查询订单支付状态 findPayStatus : ( sn ) {return axios.get(/order-service/pay/sn )}步骤二修改flow3“查询订单状态”绑定事件 步骤三修改flow3编写事件如果是成功调到到flow4 methods: {async findPayStatusFn() {let { data } await this.$request.findPayStatus( this.sn );if( data.code 20000) {location.href flow4} else {alert( data.message );}}},
步骤四编写flow4与flow3基本内容一致提示信息为“支付成功货物即将送出”
templatediv!-- 顶部导航 start --div classtopnavdiv classtopnav_bd w990 bcdiv classtopnav_left/divdiv classtopnav_right frulli您好欢迎来到畅购[a hreflogin.html登录/a] [a hrefregister.html免费注册/a] /lili classline|/lili我的订单/lili classline|/lili客户服务/li/ul/div/div/div!-- 顶部导航 end --div styleclear:both;/div!-- 页面头部 start --div classheader w990 bc mt15div classlogo w990h2 classfla hrefindex.htmlimg srcimages/logo.png alt畅购商城/a/h2div classflow fr flow3ulli1.我的购物车/lili2.填写核对订单信息/lili classcur3.成功提交订单/li/ul/div/div/div!-- 页面头部 end --div styleclear:both;/div!-- 主体部分 start --div classsuccess w990 bc mt15div classsuccess_hdh2订单支付成功/h2/divdiv classsuccess_bdpspan/span支付成功货物即将送出/p/div/div!-- 主体部分 end --div styleclear:both;/div!-- 底部版权 start --Footer/Footer!-- 底部版权 end --/div
/templatescript
import TopNav from ../components/TopNav
import Footer from ../components/Footerexport default {head: {title: 首页,link: [{rel:stylesheet,href: /style/success.css},],script: []},components: {TopNav,Footer,}}
/scriptstyle/style
前置技术RabbitMQ
更新订单状态 步骤一配置环境
rabbitmq中添加order_pay队列
添加依赖
添加yml配置
步骤二修改回调函数将sn存放到rabbit中
步骤三编写监听器消费者更新订单状态
步骤四修改OrderService完成修改功能
步骤五修改OrderMapper完成修改功能 步骤一配置环境
rabbitmq中添加order_pay队列添加rabbit配置类
ackage com.czxy.changgou4.config;import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;/*** author 桐叔* email liangtongitcast.cn*/
Component
public class OrderPayQueue {private static final String ORDER_PAY_QUEUE order_pay;Beanpublic Queue queue() {return new Queue(ORDER_PAY_QUEUE);}
} 添加依赖
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-amqp/artifactId
/dependency
添加yml配置
spring:rabbitmq:host: 127.0.0.1username: guestpassword: guest
步骤二修改回调函数将sn存放到rabbit中 rabbitTemplate.convertAndSend(, order_pay, sn); 步骤三编写监听器消费者更新订单状态
package com.czxy.changgou4.listener;import com.czxy.changgou4.service.OrderService;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;/*** author 桐叔* email liangtongitcast.cn*/
Component
RabbitListener(queues order_pay)
public class OrderPayListener {Autowiredprivate OrderService orderService;/*** 更新支付状态* param message*/RabbitHandlerpublic void updatePayStatus(String message){orderService.updatePayStatus( message , 1 );}
}步骤四修改OrderService完成修改功能
package com.czxy.changgou4.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.czxy.changgou4.pojo.Order;
import com.czxy.changgou4.pojo.User;
import com.czxy.changgou4.vo.CartVo;
import com.czxy.changgou4.vo.OrderVo;import java.util.List;public interface OrderService extends IServiceOrder {void updatePayStatus(String sn, String status);
}
package com.czxy.changgou4.service.impl;import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.czxy.changgou4.pojo.Order;
import com.czxy.changgou4.pojo.OrderGoods;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource;
import java.util.*;Service
Transactional
public class OrderServiceImpl extends ServiceImplOrderMapper, Order implements OrderService {Overridepublic void updatePayStatus(String sn, String status) {//更新状态baseMapper.updateStatus(sn,status);}
}
步骤五修改OrderMapper完成修改功能
package com.czxy.changgou4.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.czxy.changgou4.pojo.Order;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;Mapper
public interface OrderMapper extends BaseMapperOrder {/*** 更加sn修改状态* param sn* param status*/Update(UPDATE tb_order SET STATUS #{status} WHERE sn #{sn})void updateStatus(Param(sn) String sn, Param(status) String status);
}
测试在rabbitMQ web控制台可以手动发布消息