微信小程序支付+Java后台实现(完整版)
一,准备工作
appid=******** //小程序appid mchid=******** //小程序绑定商户id key=***************** //商户后台设置的key
并在商户后天设置开发者选项,主要是设置回调域名。
二,Java后台代码编写
Controller层代码:
@RestController
@RequestMapping(value = "/payment/")
public class PaymentController {
private static Logger logger = LoggerFactory.getLogger(PaymentController.class);
@Value("${hcc.wx.domain}")
private String orderDomain;
@Autowired
private PaymentService paymentService;
/**
* <p>统一下单入口</p>
*
* @param request
* @param response
* @throws Exception
*/
@ResponseBody
@RequestMapping(value="toPay", method=RequestMethod.POST,
produces ={"application/json;charset=UTF-8"})
public JSONObject toPay(HttpServletRequest request) throws Exception {
String requestStr = RequestStr.getRequestStr(request);
if (StringUtils.isEmpty(requestStr)) {
throw new ParamException();
}
JSONObject jsonObj = JSONObject.parseObject(requestStr);
if(StringUtils.isEmpty(jsonObj.getString("orderNo")) || StringUtils.isEmpty(jsonObj.getString("openId"))){
throw new ParamException();
}
OrderInfo orderInfo = .....//此处写获取订单信息方法
if(orderInfo == null){
return AjaxUtil.renderFailMsg("订单不存在!");
}else if(orderInfo.getPayAmount() == null || orderInfo.getPayAmount() <= 0){
return AjaxUtil.renderFailMsg("订单有误,请确认!");
}else if(orderInfo.getOrderStatus() != 1){//1待付款
String msg = orderInfo.getOrderStatus() >1 ?"此订单已支付!":"订单未提交,请确认!";
return AjaxUtil.renderFailMsg(msg);
}else{
logger.info("【小程序支付服务】请求订单编号:["+orderInfo.getOrderNo()+"]");
Map<String, String> resMap = paymentService.xcxPayment(+orderInfo.getOrderNo(),orderInfo.getPayAmount(),jsonObj.getString("openId"));
if("SUCCESS".equals(resMap.get("returnCode")) && "OK".equals(resMap.get("returnMsg"))){
//统一下单成功
resMap.remove("returnCode");
resMap.remove("returnMsg");
logger.info("【小程序支付服务】支付下单成功!");
return AjaxUtil.renderSuccessMsg(resMap);
}else{
logger.info("【小程序支付服务】支付下单失败!原因:"+resMap.get("returnMsg"));
return AjaxUtil.renderFailMsg(resMap.get("returnMsg"));
}
}
}
/**
* <p>回调Api</p>
*
* @param request
* @param response
* @throws Exception
*/
@RequestMapping(value="xcxNotify")
public void xcxNotify(HttpServletRequest request,HttpServletResponse response) throws Exception {
InputStream inputStream = request.getInputStream();
//获取请求输入流
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len=inputStream.read(buffer))!=-1){
outputStream.write(buffer,0,len);
}
outputStream.close();
inputStream.close();
Map<String,Object> map = BeanToMap.getMapFromXML(new String(outputStream.toByteArray(),"utf-8"));
logger.info("【小程序支付回调】 回调数据:
"+map);
String resXml = "";
String returnCode = (String) map.get("return_code");
if ("SUCCESS".equalsIgnoreCase(returnCode)) {
String returnmsg = (String) map.get("result_code");
if("SUCCESS".equals(returnmsg)){
//更新数据
int result = paymentService.xcxNotify(map);
if(result > 0){
//支付成功
resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"
+ "<return_msg><![CDATA[OK]]></return_msg>"+"</xml>";
}
}else{
resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>"
+ "<return_msg><![CDATA[报文为空]></return_msg>" + "</xml>";
logger.info("支付失败:"+resXml);
}
}else{
resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>"
+ "<return_msg><![CDATA[报文为空]></return_msg>" + "</xml>";
logger.info("【订单支付失败】");
}
logger.info("【小程序支付回调响应】 响应内容:
"+resXml);
response.getWriter().print(resXml);
}
}
Service接口层代码(部分代码):
/**
* <p>支付接口层</p>
*
* @author att
* @date 2018年5月27日
* @since jdk1.8
* @version 1.0
*/
public interface PaymentService {
Map<String,String> xcxPayment(String orderNo, double money,String openId) throws Exception;
int xcxNotify(Map<String,Object> map) throws Exception;
}
Service接口实现(部分代码):
PayUtil工具类:
支付配置类:
Properties配置:
##config xcx.pay.appid=wx********** xcx.pay.mchid=***** xcx.pay.key=**********
三,小程序端(获取统一下单返回参数发起支付)
测试一把:
上一篇:
uniapp开发微信小程序-2.页面制作
下一篇:
微信小程序实现登录之java后台
