mirror of
				https://github.com/YunaiV/ruoyi-vue-pro.git
				synced 2025-10-31 10:37:41 +08:00 
			
		
		
		
	支付宝手机网站支付
This commit is contained in:
		| @ -1,9 +1,11 @@ | ||||
| package cn.iocoder.yudao.coreservice.modules.pay.service.order; | ||||
|  | ||||
| import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderDO; | ||||
|  | ||||
| import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderCreateReqDTO; | ||||
| import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitReqDTO; | ||||
| import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitRespDTO; | ||||
| import cn.iocoder.yudao.framework.pay.core.client.dto.NotifyDataDTO; | ||||
|  | ||||
| import javax.validation.Valid; | ||||
|  | ||||
| @ -46,6 +48,6 @@ public interface PayOrderCoreService { | ||||
|     * @param channelCode 渠道编码 | ||||
|     * @param notifyData 通知数据 | ||||
|     */ | ||||
|    void notifyPayOrder(Long channelId, String channelCode, String notifyData) throws Exception; | ||||
|    void notifyPayOrder(Long channelId, String channelCode, NotifyDataDTO notifyData) throws Exception; | ||||
|  | ||||
| } | ||||
|  | ||||
| @ -18,6 +18,7 @@ import cn.iocoder.yudao.coreservice.modules.pay.service.merchant.PayChannelCoreS | ||||
| import cn.iocoder.yudao.coreservice.modules.pay.service.notify.PayNotifyCoreService; | ||||
| import cn.iocoder.yudao.coreservice.modules.pay.service.notify.dto.PayNotifyTaskCreateReqDTO; | ||||
| import cn.iocoder.yudao.coreservice.modules.pay.service.order.PayOrderCoreService; | ||||
|  | ||||
| import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderCreateReqDTO; | ||||
| import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitReqDTO; | ||||
| import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitRespDTO; | ||||
| @ -26,6 +27,7 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | ||||
| import cn.iocoder.yudao.framework.pay.config.PayProperties; | ||||
| import cn.iocoder.yudao.framework.pay.core.client.PayClient; | ||||
| import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory; | ||||
| import cn.iocoder.yudao.framework.pay.core.client.dto.NotifyDataDTO; | ||||
| import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO; | ||||
| import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| @ -135,9 +137,11 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService { | ||||
|         // 调用三方接口 | ||||
|         PayOrderUnifiedReqDTO unifiedOrderReqDTO = PayOrderCoreConvert.INSTANCE.convert2(reqDTO); | ||||
|         // 商户相关字段 | ||||
|         //TODO jason @芋艿 是否加一个属性  如tradeNo 支付订单号, 用这个merchantOrderId让人迷糊 | ||||
|         unifiedOrderReqDTO.setMerchantOrderId(orderExtension.getNo()) // 注意,此处使用的是 PayOrderExtensionDO.no 属性! | ||||
|                 .setSubject(order.getSubject()).setBody(order.getBody()) | ||||
|                 .setNotifyUrl(genChannelPayNotifyUrl(channel)); | ||||
|                 .setNotifyUrl(genChannelPayNotifyUrl(channel)) | ||||
|                 .setReturnUrl(genChannelReturnUrl(channel)); | ||||
|         // 订单相关字段 | ||||
|         unifiedOrderReqDTO.setAmount(order.getAmount()).setExpireTime(order.getExpireTime()); | ||||
|         CommonResult<?> unifiedOrderResult = client.unifiedOrder(unifiedOrderReqDTO); | ||||
| @ -149,6 +153,16 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService { | ||||
|                 .setInvokeResponse(unifiedOrderResult.getData()); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 根据支付渠道的编码,生成支付渠道的返回地址 | ||||
|      * @param channel | ||||
|      * @return | ||||
|      */ | ||||
|     private String genChannelReturnUrl(PayChannelDO channel) { | ||||
|         return payProperties.getReturnUrl() + "/" + StrUtil.replace(channel.getCode(), "_", "-") | ||||
|                 + "/" + channel.getId(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 根据支付渠道的编码,生成支付渠道的回调地址 | ||||
|      * | ||||
| @ -181,9 +195,9 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService { | ||||
|  | ||||
|     @Override | ||||
|     @Transactional | ||||
|     public void notifyPayOrder(Long channelId, String channelCode, String notifyData) throws Exception { | ||||
|     public void notifyPayOrder(Long channelId, String channelCode, NotifyDataDTO notifyData) throws Exception { | ||||
|         // TODO 芋艿,记录回调日志 | ||||
|         log.info("[notifyPayOrder][channelId({}) 回调数据({})]", channelId, notifyData); | ||||
|         log.info("[notifyPayOrder][channelId({}) 回调数据({})]", channelId, notifyData.getOrigData()); | ||||
|  | ||||
|         // 校验支付渠道是否有效 | ||||
|         PayChannelDO channel = payChannelCoreService.validPayChannel(channelId); | ||||
| @ -193,6 +207,7 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService { | ||||
|             log.error("[notifyPayOrder][渠道编号({}) 找不到对应的支付客户端]", channel.getId()); | ||||
|             throw exception(PAY_CHANNEL_CLIENT_NOT_FOUND); | ||||
|         } | ||||
|         //TODO @jason 校验 是否支付宝调用。 使用 支付宝publickey 或者payclient 加一个校验方法 | ||||
|         // 解析支付结果 | ||||
|         PayOrderNotifyRespDTO notifyRespDTO = client.parseOrderNotify(notifyData); | ||||
|  | ||||
| @ -207,9 +222,10 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService { | ||||
|             throw exception(PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING); | ||||
|         } | ||||
|         // 1.2 更新 PayOrderExtensionDO | ||||
|         //TODO @jason notifyRespDTO.getTradeStatus() 需要根据不同的状态更新成不同的值 PayOrderStatusEnum | ||||
|         int updateCounts = payOrderExtensionCoreMapper.updateByIdAndStatus(orderExtension.getId(), | ||||
|                 PayOrderStatusEnum.WAITING.getStatus(), PayOrderExtensionDO.builder().id(orderExtension.getId()) | ||||
|                         .status(PayOrderStatusEnum.SUCCESS.getStatus()).channelNotifyData(notifyData).build()); | ||||
|                         .status(PayOrderStatusEnum.SUCCESS.getStatus()).channelNotifyData(notifyData.getOrigData()).build()); | ||||
|         if (updateCounts == 0) { // 校验状态,必须是待支付 | ||||
|             throw exception(PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING); | ||||
|         } | ||||
|  | ||||
| @ -29,4 +29,11 @@ public class PayProperties { | ||||
|     @URL(message = "退款回调地址的格式必须是 URL") | ||||
|     private String refundNotifyUrl; | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * 支付完成的返回地址 | ||||
|      */ | ||||
|     @URL(message = "支付返回的地址的格式必须是 URL") | ||||
|     private String returnUrl; | ||||
|  | ||||
| } | ||||
|  | ||||
| @ -1,5 +1,6 @@ | ||||
| package cn.iocoder.yudao.framework.pay.core.client; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.pay.core.client.dto.NotifyDataDTO; | ||||
| import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO; | ||||
| import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; | ||||
|  | ||||
| @ -32,6 +33,6 @@ public interface PayClient { | ||||
|      * @return 解析结果 | ||||
|      * @throws Exception 解析失败,抛出异常 | ||||
|      */ | ||||
|     PayOrderNotifyRespDTO parseOrderNotify(String data) throws Exception; | ||||
|     PayOrderNotifyRespDTO parseOrderNotify(NotifyDataDTO data) throws Exception; | ||||
|  | ||||
| } | ||||
|  | ||||
| @ -0,0 +1,20 @@ | ||||
| package cn.iocoder.yudao.framework.pay.core.client.dto; | ||||
|  | ||||
| import lombok.Builder; | ||||
| import lombok.Data; | ||||
| import lombok.ToString; | ||||
|  | ||||
| import java.util.Map; | ||||
|  | ||||
| @Data | ||||
| @ToString | ||||
| @Builder | ||||
| public class NotifyDataDTO { | ||||
|  | ||||
|     private String origData; | ||||
|     //1:xml 2:form | ||||
|     private int format; | ||||
|  | ||||
|     //form 格式的 data; | ||||
|     private Map<String,String> params; | ||||
| } | ||||
| @ -42,4 +42,14 @@ public class PayOrderNotifyRespDTO { | ||||
|      */ | ||||
|     private String data; | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * TODO @jason 结合其他的渠道定义成枚举, | ||||
|      * alipay | ||||
|      * TRADE_CLOSED,未付款交易超时关闭,或支付完成后全额退款。 | ||||
|      * TRADE_SUCCESS, 交易支付成功 | ||||
|      * TRADE_FINISHED 	交易结束,不可退款。 | ||||
|      */ | ||||
|     private String tradeStatus; | ||||
|  | ||||
| } | ||||
|  | ||||
| @ -50,6 +50,9 @@ public class PayOrderUnifiedReqDTO { | ||||
|     @URL(message = "支付结果的回调地址必须是 URL 格式") | ||||
|     private String notifyUrl; | ||||
|  | ||||
|     @URL(message = "支付结果的return 必须是 URL 格式") | ||||
|     private String returnUrl; | ||||
|  | ||||
|     // ========== 订单相关字段 ========== | ||||
|  | ||||
|     /** | ||||
|  | ||||
| @ -18,6 +18,10 @@ public class AlipayPayCodeMapping extends AbstractPayCodeMapping { | ||||
|         if (Objects.equals(apiCode, "10000")) { | ||||
|             return GlobalErrorCodeConstants.SUCCESS; | ||||
|         } | ||||
|         // alipay wap  api code 返回为null, 暂时定为-9999 | ||||
|         if(Objects.equals(apiCode, "-9999")){ | ||||
|             return GlobalErrorCodeConstants.SUCCESS; | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|  | ||||
| @ -2,6 +2,7 @@ package cn.iocoder.yudao.framework.pay.core.client.impl.alipay; | ||||
|  | ||||
| import cn.hutool.core.bean.BeanUtil; | ||||
| import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult; | ||||
| import cn.iocoder.yudao.framework.pay.core.client.dto.NotifyDataDTO; | ||||
| import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO; | ||||
| import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; | ||||
| import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient; | ||||
| @ -68,7 +69,7 @@ public class AlipayQrPayClient extends AbstractPayClient<AlipayPayClientConfig> | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public PayOrderNotifyRespDTO parseOrderNotify(String data) throws Exception { | ||||
|     public PayOrderNotifyRespDTO parseOrderNotify(NotifyDataDTO data) throws Exception { | ||||
|         // TODO 芋艿:待完成 | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
| @ -1,7 +1,9 @@ | ||||
| package cn.iocoder.yudao.framework.pay.core.client.impl.alipay; | ||||
|  | ||||
| import cn.hutool.core.bean.BeanUtil; | ||||
| import cn.hutool.core.date.DateUtil; | ||||
| import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult; | ||||
| import cn.iocoder.yudao.framework.pay.core.client.dto.NotifyDataDTO; | ||||
| import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO; | ||||
| import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; | ||||
| import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient; | ||||
| @ -14,6 +16,9 @@ import com.alipay.api.request.AlipayTradeWapPayRequest; | ||||
| import com.alipay.api.response.AlipayTradeWapPayResponse; | ||||
| import lombok.SneakyThrows; | ||||
|  | ||||
| import java.util.Map; | ||||
| import java.util.Objects; | ||||
|  | ||||
| /** | ||||
|  * 支付宝【手机网站】的 PayClient 实现类 | ||||
|  * 文档:https://opendocs.alipay.com/apis/api_1/alipay.trade.wap.pay | ||||
| @ -45,12 +50,15 @@ public class AlipayWapPayClient extends AbstractPayClient<AlipayPayClientConfig> | ||||
|         model.setBody(reqDTO.getBody()); | ||||
|         model.setTotalAmount(calculateAmount(reqDTO.getAmount()).toString()); | ||||
|         model.setProductCode("QUICK_WAP_PAY"); // TODO 芋艿:这里咋整 | ||||
|         model.setSellerId("2088102147948060"); // TODO 芋艿:这里咋整 | ||||
|         // TODO 芋艿:userIp + expireTime | ||||
|         //TODO 芋艿:这里咋整  jason @芋艿 可以去掉吧, | ||||
|         //model.setSellerId("2088102147948060"); | ||||
|         model.setTimeExpire(DateUtil.format(reqDTO.getExpireTime(),"yyyy-MM-dd HH:mm:ss")); | ||||
|         // TODO 芋艿:userIp | ||||
|         // 构建 AlipayTradeWapPayRequest | ||||
|         AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest(); | ||||
|         request.setBizModel(model); | ||||
|  | ||||
|         request.setNotifyUrl(reqDTO.getNotifyUrl()); | ||||
|         request.setReturnUrl(reqDTO.getReturnUrl()); | ||||
|         // 执行请求 | ||||
|         AlipayTradeWapPayResponse response; | ||||
|         try { | ||||
| @ -58,13 +66,30 @@ public class AlipayWapPayClient extends AbstractPayClient<AlipayPayClientConfig> | ||||
|         } catch (AlipayApiException e) { | ||||
|             return PayCommonResult.build(e.getErrCode(), e.getErrMsg(), null, codeMapping); | ||||
|         } | ||||
| //         TODO 芋艿:sub Code | ||||
|  | ||||
|         // TODO 芋艿:sub Code | ||||
|         if(response.isSuccess() && Objects.isNull(response.getCode()) && Objects.nonNull(response.getBody())){ | ||||
|             //成功alipay wap 成功 code 为 null , body 为form 表单 | ||||
|             return PayCommonResult.build("-9999", "Success", response, codeMapping); | ||||
|         }else { | ||||
|             return PayCommonResult.build(response.getCode(), response.getMsg(), response, codeMapping); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      *  //https://opendocs.alipay.com/open/203/105286 | ||||
|      * @param data 通知结果 | ||||
|      * @return | ||||
|      * @throws Exception | ||||
|      */ | ||||
|     @Override | ||||
|     public PayOrderNotifyRespDTO parseOrderNotify(String data) throws Exception { | ||||
|         // TODO 芋艿:待完成 | ||||
|         return null; | ||||
|     public PayOrderNotifyRespDTO parseOrderNotify(NotifyDataDTO data) throws Exception { | ||||
|         Map<String, String> params = data.getParams(); | ||||
|         return  PayOrderNotifyRespDTO.builder().orderExtensionNo(params.get("out_trade_no")) | ||||
|                 .channelOrderNo(params.get("trade_no")).channelUserId(params.get("seller_id")) | ||||
|                 .tradeStatus(params.get("trade_status")) | ||||
|                 .successTime(DateUtil.parse(params.get("notify_time"), "yyyy-MM-dd HH:mm:ss")) | ||||
|                 .data(data.getOrigData()).build(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -8,6 +8,7 @@ import cn.hutool.core.util.StrUtil; | ||||
| import cn.iocoder.yudao.framework.common.util.io.FileUtils; | ||||
| import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; | ||||
| import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult; | ||||
| import cn.iocoder.yudao.framework.pay.core.client.dto.NotifyDataDTO; | ||||
| import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO; | ||||
| import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO; | ||||
| import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient; | ||||
| @ -131,14 +132,14 @@ public class WXPubPayClient extends AbstractPayClient<WXPayClientConfig> { | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public PayOrderNotifyRespDTO parseOrderNotify(String data) throws WxPayException { | ||||
|         WxPayOrderNotifyResult notifyResult = client.parseOrderNotifyResult(data); | ||||
|     public PayOrderNotifyRespDTO parseOrderNotify(NotifyDataDTO data) throws WxPayException { | ||||
|         WxPayOrderNotifyResult notifyResult = client.parseOrderNotifyResult(data.getOrigData()); | ||||
|         Assert.isTrue(Objects.equals(notifyResult.getResultCode(), "SUCCESS"), "支付结果非 SUCCESS"); | ||||
|         // 转换结果 | ||||
|         return PayOrderNotifyRespDTO.builder().orderExtensionNo(notifyResult.getOutTradeNo()) | ||||
|                 .channelOrderNo(notifyResult.getTransactionId()).channelUserId(notifyResult.getOpenid()) | ||||
|                 .successTime(DateUtil.parse(notifyResult.getTimeEnd(), "yyyyMMddHHmmss")) | ||||
|                 .data(data).build(); | ||||
|                 .data(data.getOrigData()).build(); | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| @ -6,17 +6,21 @@ import cn.iocoder.yudao.coreservice.modules.pay.service.order.PayOrderCoreServic | ||||
| import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitReqDTO; | ||||
| import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitRespDTO; | ||||
| import cn.iocoder.yudao.framework.common.pojo.CommonResult; | ||||
| import cn.iocoder.yudao.framework.pay.core.client.dto.NotifyDataDTO; | ||||
| import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum; | ||||
| import cn.iocoder.yudao.userserver.modules.pay.controller.order.vo.PayOrderSubmitReqVO; | ||||
| import cn.iocoder.yudao.userserver.modules.pay.controller.order.vo.PayOrderSubmitRespVO; | ||||
| import io.swagger.annotations.Api; | ||||
| import io.swagger.annotations.ApiOperation; | ||||
| import lombok.extern.slf4j.Slf4j; | ||||
| import org.springframework.http.MediaType; | ||||
| import org.springframework.validation.annotation.Validated; | ||||
| import org.springframework.web.bind.annotation.*; | ||||
|  | ||||
| import javax.annotation.Resource; | ||||
|  | ||||
| import java.util.Map; | ||||
|  | ||||
| import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | ||||
| import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP; | ||||
|  | ||||
| @ -54,7 +58,7 @@ public class PayOrderController { | ||||
|     @ApiOperation("通知微信公众号支付的结果") | ||||
|     public String notifyWxPayOrder(@PathVariable("channelId") Long channelId, | ||||
|                                    @RequestBody String xmlData) throws Exception { | ||||
|         payOrderCoreService.notifyPayOrder(channelId, PayChannelEnum.WX_PUB.getCode(), xmlData); | ||||
|         payOrderCoreService.notifyPayOrder(channelId, PayChannelEnum.WX_PUB.getCode(), NotifyDataDTO.builder().origData(xmlData).build()); | ||||
|         return "success"; | ||||
|     } | ||||
|  | ||||
| @ -72,4 +76,27 @@ public class PayOrderController { | ||||
|         return "success"; | ||||
|     } | ||||
|  | ||||
|     @PostMapping(value = "/notify/alipay-wap/{channelId}", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) | ||||
|     @ApiOperation("支付宝wap页面回调") | ||||
|     public String notifyAliPayWapPayOrder(@PathVariable("channelId") Long channelId, | ||||
|                                           @RequestParam  Map<String, String> params, | ||||
|                                           @RequestBody String  originData) throws Exception { | ||||
|         //TODO @jason 校验 是否支付宝调用。 使用 支付宝publickey payclient 或许加一个校验方法 | ||||
|         payOrderCoreService.notifyPayOrder(channelId, PayChannelEnum.ALIPAY_WAP.getCode(), NotifyDataDTO.builder().params(params).origData(originData).build()); | ||||
|         return "success"; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * https://opendocs.alipay.com/open/203/105285#%E5%89%8D%E5%8F%B0%E5%9B%9E%E8%B7%B3%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E | ||||
|      * @param channelId | ||||
|      * @return | ||||
|      * @throws Exception | ||||
|      */ | ||||
|     @GetMapping(value = "/return/alipay-wap/{channelId}") | ||||
|     @ApiOperation("支付宝wap页面回跳") | ||||
|     public String returnAliPayWapPayOrder(@PathVariable("channelId") Long channelId){ | ||||
|         //TODO @jason 校验 是否支付宝调用。 支付宝publickey 可以根据 appId 跳转不同的页面 | ||||
|         return "支付成功"; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| @ -153,5 +153,6 @@ yudao: | ||||
|       - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求 | ||||
|   demo: false # 关闭演示模式 | ||||
|   pay: | ||||
|     pay-notify-url: http://niubi.natapp1.cc/api/pay/order/notify | ||||
|     refund-notify-url: http://niubi.natapp1.cc/api/pay/refund/notify | ||||
|     pay-notify-url: http://jg6rde.natappfree.cc/api/pay/order/notify | ||||
|     refund-notify-url: http://jg6rde.natappfree.cc/api/pay/refund/notify | ||||
|     return-url: http://jg6rde.natappfree.cc/api/pay/order/return | ||||
|  | ||||
| @ -0,0 +1,65 @@ | ||||
| <!DOCTYPE html> | ||||
| <html> | ||||
| <head> | ||||
|     <meta charset="UTF-8"> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"/> | ||||
|     <title>支付测试页</title> | ||||
|     <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script> | ||||
| </head> | ||||
| <body> | ||||
| <div>点击如下按钮,发起支付的测试</div> | ||||
| <div> | ||||
|     <button id="alipay_wap">支付宝h5</button> | ||||
| </div> | ||||
| <div id="dynamic_form"></div> | ||||
| </body> | ||||
| <script> | ||||
|     let shopOrderId = undefined; | ||||
|     let payOrderId = undefined; | ||||
|      let server = 'http://127.0.0.1:28080'; | ||||
|     //let server = 'http://niubi.natapp1.cc'; | ||||
|     // TODO openid | ||||
|     //let openid = "ockUAwIZ-0OeMZl9ogcZ4ILrGba0"; | ||||
|     $(function() { | ||||
|         // 自动发起商城订单编号 | ||||
|         $.ajax({ | ||||
|             url: server + "/api/shop/order/create", | ||||
|             method: 'POST', | ||||
|             success: function( result ) { | ||||
|                 if (result.code !== 0) { | ||||
|                     alert('创建商城订单失败,原因:' + result.msg) | ||||
|                     return; | ||||
|                 } | ||||
|                 shopOrderId = result.data.id; | ||||
|                 payOrderId = result.data.payOrderId; | ||||
|                 console.log("商城订单:" + shopOrderId) | ||||
|                 console.log("支付订单:" + payOrderId) | ||||
|             } | ||||
|         }) | ||||
|     }); | ||||
|     // 微信公众号 | ||||
|     $( "#alipay_wap").on( "click", function() { | ||||
|         // 提交支付 | ||||
|         $.ajax({ | ||||
|             url: server + "/api/pay/order/submit", | ||||
|             method: 'POST', | ||||
|             dataType: "json", | ||||
|             contentType: "application/json", | ||||
|             data: JSON.stringify({ | ||||
|                 "id": payOrderId, | ||||
|                 "channelCode": 'alipay_wap' | ||||
|             }), | ||||
|             success: function( result ) { | ||||
|                 if (result.code !== 0) { | ||||
|                     alert('提交支付订单失败,原因:' + result.msg) | ||||
|                     return; | ||||
|                 } | ||||
|                 alert('点击确定,开始支付'); | ||||
|                 // 开始调用微信支付 | ||||
|                 let data = result.data.invokeResponse; | ||||
|                 $("#dynamic_form").html(data.body); | ||||
|             } | ||||
|         }) | ||||
|     }); | ||||
| </script> | ||||
| </html> | ||||
		Reference in New Issue
	
	Block a user
	 jason
					jason