| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467 |
- <template>
- <div class="wrapper">
- <div class="box">
- <div class="block block-1">
- <image class="img" src="@/pages/cart/static/pay.png" />
- <p class="ptips">收银台</p>
- <p class="ptips">剩余支付时间:
- <u-count-down :show-days="false" :show-border="true" font-size="28" color="#008ffa"
- border-color="#008ffa" ref="uCountDown" :timestamp="autoCancel"></u-count-down>
- </p>
- <p class="ptips">
- 支付金额
- <span>¥{{ cashierParams.price | unitPrice }}</span>
- </p>
- </div>
- </div>
- <div class="__pay_form__">
- </div>
- <div class="block-4" v-if="cashierParams.price > 0">
- <div class="payItem">支付方式</div>
- <div class="payItem" v-for="(item, index) in payList" :key="index">
- <u-row class="row">
- <div class="col1" @click="awaitPay(item, index)" size="100" style="text-align:left;">
- <div v-if="item == 'ALIPAY'">
- <u-icon class="method_icon" name="zhifubao-circle-fill" color="#008ffa" size="80"></u-icon>
- <span class="method_name">支付宝</span>
- </div>
- <div v-if="item == 'WECHAT'">
- <u-icon class="method_icon" name="weixin-circle-fill" color="#00c98b" size="80"></u-icon>
- <span class="method_name">微信</span>
- </div>
- <div v-if="item == 'WALLET'">
- <u-icon class="method_icon" name="red-packet-fill" color="#dd6161" size="80"></u-icon>
- <span class="method_name">余额支付(当前余额:¥{{ walletValue | unitPrice }})</span>
- </div>
- </div>
- <div class="col3" @click="awaitPay(item)" textAlign="right">
- <u-icon size="26" color="#b1b1b1" name="arrow-right"></u-icon>
- </div>
- </u-row>
- </div>
- </div>
- </div>
- </template>
- <script>
- import * as API_Trade from "@/api/trade";
- export default {
- data() {
- return {
- //路径传参
- routerVal: "",
- //收银台参数
- cashierParams: "",
- //支付方式集合
- payList: "",
- //支付sn
- sn: "",
- //订单类型
- orderType: "",
- //支付异常
- exception: {},
- //支付表单
- payForm: {},
- //支付类型 APP/WECHAT_MP/H5/NATIVE app/微信小程序/h5/二维码
- paymentType: "",
- // 支付客户端 APP/NATIVE/JSAPI/H5
- paymentClient: "",
- //余额
- walletValue: 0.0,
- // 支付倒计时
- autoCancel: 0,
- };
- },
- onLoad(val) {
- this.routerVal = val;
- //初始化参数
- // #ifdef APP-PLUS
- this.paymentType = "APP";
- this.paymentClient = "APP";
- //#endif
- // #ifdef MP-WEIXIN
- this.paymentType = "WECHAT_MP";
- this.paymentClient = "MP";
- //#endif
- // #ifdef H5
- this.paymentType = "H5";
- //如果是微信浏览器,则使用公众号支付,否则使用h5,
- // 区别是:h5是通过浏览器外部调用微信app进行支付,而JSAPI则是 在微信浏览器内部,或者小程序 调用微信支付
- this.paymentClient = this.isWeiXin() ? "JSAPI" : "H5";
- //#endif
- },
- onBackPress(e) {
- if (e.from == "backbutton") {
- uni.redirectTo({
- url: "/pages/order/myOrder?status=0",
- });
- return true; //阻止默认返回行为
- }
- },
- mounted() {
- this.cashierData();
- },
- methods: {
- navigateTo(url) {
- uni.navigateTo({
- url,
- });
- },
- // 获取收银详情
- cashierData() {
- let parms = {};
- if (this.routerVal.recharge_sn) {
- this.sn = this.routerVal.recharge_sn;
- this.orderType = "RECHARGE";
- } else if (this.routerVal.trade_sn) {
- this.sn = this.routerVal.trade_sn;
- this.orderType = "TRADE";
- } else {
- this.sn = this.routerVal.order_sn;
- this.orderType = "ORDER";
- }
- parms.sn = this.sn;
- parms.orderType = this.orderType;
- parms.clientType = this.paymentType;
- API_Trade.getCashierData(parms).then((res) => {
- this.cashierParams = res.data.result;
- // #ifdef MP-WEIXIN
- this.payList = res.data.result.support.filter((item) => {
- return item != "ALIPAY";
- });
- // #endif
- // #ifndef MP-WEIXIN
- this.payList = res.data.result.support;
- // #endif
- this.walletValue = res.data.result.walletValue;
- this.autoCancel =
- (res.data.result.autoCancel - new Date().getTime()) / 1000;
- });
- },
- awaitPay(payment){
- this.pay(payment)
-
- },
- //订单支付
- async pay(payment) {
- // 支付编号
- const sn = this.sn;
- // 交易类型【交易号|订单号】
- const orderType = this.orderType;
- const clientType = this.paymentType;
- let params = {
- sn,
- orderType,
- clientType,
- };
- //支付方式 WECHAT/ALIPAY
- const paymentMethod = payment;
- // 客户端类型 APP/NATIVE/JSAPI/H5
- const paymentClient = this.paymentClient;
- // #ifdef APP-PLUS
- //APP pay
- // 初始化支付签名
- await API_Trade.initiatePay(paymentMethod, paymentClient, params).then(
- (signXml) => {
- //如果支付异常
- if (!signXml.data.success) {
- uni.showModal({
- content: signXml.data.message,
- showCancel: false,
- })
- return;
- }
- let payForm = signXml.data.result;
- console.log(payForm)
- let paymentType = paymentMethod === "WECHAT" ? "wxpay" : "alipay";
- uni.requestPayment({
- provider: paymentType,
- orderInfo: payForm,
- success: (e) => {
- console.log(e);
- uni.showToast({
- icon: "none",
- title: "支付成功!",
- });
- uni.navigateTo({
- url: "/pages/payment/success?paymentType=" +
- paymentType +
- "&payPrice=" +
- this.cashierParams.price,
- });
- },
- fail: (e) => {
- console.log(e);
- this.exception = e;
- uni.showModal({
- content: "支付失败,如果您已支付,请勿反复支付",
- showCancel: false,
- });
- },
- });
- }
- );
- //APP pay
- // #endif
- //#ifdef H5
- //H5 pay
- await API_Trade.initiatePay(paymentMethod, paymentClient, params).then(
- (res) => {
- let response = res.data;
- //如果非支付宝支付才需要进行判定,因为支付宝h5支付是直接输出的,没有返回所谓的消息状态
- if(paymentMethod !== "ALIPAY"){
- //如果支付异常
- if (!response.success) {
- uni.showModal({
- content: response.message,
- showCancel: false,
- })
- return;
- }
- }
- if (paymentMethod === "ALIPAY") {
- document.write(response);
- } else if (paymentMethod === "WECHAT") {
- if (this.isWeiXin()) {
- //微信公众号支付
- WeixinJSBridge.invoke(
- "getBrandWCPayRequest",
- response.result,
- function(res) {
- if (res.err_msg == "get_brand_wcpay_request:ok") {
- // 使用以上方式判断前端返回,微信团队郑重提示:
- //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
- uni.showToast({
- icon: "none",
- title: "支付成功!",
- });
- uni.navigateTo({
- url: "/pages/cart/payment/success?paymentMethod=" +
- paymentMethod +
- "&payPrice=" +
- this.cashierParams.price,
- });
- } else {
- uni.showModal({
- content: "支付失败,如果您已支付,请勿反复支付",
- showCancel: false,
- });
- }
- }
- );
- } else {
- window.location.href = JSON.parse(response.result).h5_url;
- }
- } else if (paymentMethod === "WALLET") {
- uni.showToast({
- title: response.message,
- icon: "none",
- });
- if (response.success) {
- uni.navigateTo({
- url: "/pages/cart/payment/success?paymentMethod=" +
- paymentMethod +
- "&payPrice=" +
- this.cashierParams.price,
- });
- }
- }
- }
- );
- //H5pay
- // #endif
- //#ifdef MP-WEIXIN
- //微信小程序
- await API_Trade.initiatePay(paymentMethod, paymentClient, params).then(
- (res) => {
- let response = res.data.result;
- //如果支付异常
- if (!res.data.success) {
- uni.showModal({
- content: res.data.message,
- showCancel: false,
- })
- return;
- }
- if (paymentMethod === "WECHAT") {
- uni.requestPayment({
- provider: "wxpay",
- appid: response.appid,
- timeStamp: response.timeStamp,
- nonceStr: response.nonceStr,
- package: response.package,
- signType: response.signType,
- paySign: response.paySign,
- success: (e) => {
- console.log(e);
- uni.showToast({
- icon: "none",
- title: "支付成功!",
- });
- uni.navigateTo({
- url: "/pages/cart/payment/success?paymentMethod=" +
- paymentType +
- "&payPrice=" +
- this.cashierParams.price,
- });
- },
- fail: (e) => {
- console.log(e);
- this.exception = e;
- uni.showModal({
- content: "支付失败,如果您已支付,请勿反复支付",
- showCancel: false,
- });
- },
- });
- } else {
- uni.showToast({
- icon: "none",
- title: "支付成功!",
- });
- uni.navigateTo({
- url: "/pages/cart/payment/success?paymentMethod=" +
- paymentMethod +
- "&payPrice=" +
- this.cashierParams.price,
- });
- }
- }
- );
- // #endif
- },
- isWeiXin() {
- var ua = window.navigator.userAgent.toLowerCase();
- if (ua.match(/MicroMessenger/i) == "micromessenger") {
- return true;
- } else {
- return false;
- }
- },
- },
- };
- </script>
- <style scoped lang="scss">
- .method_icon {
- vertical-align: middle;
- }
- .method_name {
- font-size: 28rpx;
- color: #999;
- padding-left: 24rpx;
- }
- .row {
- display: flex;
- width: 100%;
- }
- /deep/ .u-row {
- width: 100% !important;
- display: flex;
- justify-content: space-between !important;
- }
- .method_name,
- .col1 {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
- .col1 {
- text-align: center;
- flex: 99;
- }
- .col3 {
- text-align: right;
- flex: 1;
- }
- .payItem {
- padding: 13px 25rpx;
- border-top: 1px solid #f9f9f9;
- line-height: 100rpx;
- font-size: 36rpx;
- color: #333;
- }
- .ptips {
- font-size: 32rpx;
- margin: 20rpx 0;
- color: #333;
- >span {
- font-size: 40rpx;
- color: #df5a52;
- margin-left: 10rpx;
- }
- }
- .img {
- width: 392rpx !important;
- height: 296rpx !important;
- }
- .wrapper {
- min-height: 100vh;
- height: auto;
- background: #f9f9f9;
- }
- .block-4 {
- background: #fff;
- color: $u-tips-color;
- >p {
- padding: 8rpx;
- }
- }
- .box {
- background: #fff;
- padding: 40rpx 0;
- // justify-content: center; //这个是X轴居中
- // align-items: center; //这个是 Y轴居中
- }
- .block {
- text-align: center;
- display: block;
- width: 100%;
- image {
- width: 200rpx;
- height: 200rpx;
- }
- }
- .block-1 {
- margin-top: 80rpx;
- }
- .btns {
- margin: 0 20rpx;
- }
- </style>
|