123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- <template>
- <view>
- <page-head :title="title"></page-head>
- <view class="uni-padding-wrap">
- <view style="background:#FFF; padding:50rpx 0;">
- <view class="uni-hello-text uni-center"><text>支付金额</text></view>
- <view class="uni-h1 uni-center uni-common-mt">
- <text class="rmbLogo">¥</text>
- <input class="price" type="digit" :value="price" maxlength="4" @input="priceChange" />
- </view>
- </view>
- <view class="uni-btn-v uni-common-mt">
- <!-- #ifdef MP-WEIXIN -->
- <button type="primary" @click="weixinPay" :loading="loading">微信支付</button>
- <!-- #endif -->
- <!-- #ifdef APP-PLUS -->
- <template v-if="providerList.length > 0">
- <button v-for="(item,index) in providerList" :key="index" @click="requestPayment(item,index)" :loading="item.loading">{{item.name}}支付</button>
- </template>
- <!-- #endif -->
- </view>
- </view>
- </view>
- </template>
- <script>
- export default {
- data() {
- return {
- title: 'request-payment',
- loading: false,
- price: 1,
- providerList: []
- }
- },
- onLoad: function() {
- // #ifdef APP-PLUS
- uni.getProvider({
- service: "payment",
- success: (e) => {
- console.log("payment success:" + JSON.stringify(e));
- let providerList = [];
- e.provider.map((value) => {
- switch (value) {
- case 'alipay':
- providerList.push({
- name: '支付宝',
- id: value,
- loading: false
- });
- break;
- case 'wxpay':
- providerList.push({
- name: '微信',
- id: value,
- loading: false
- });
- break;
- default:
- break;
- }
- })
- this.providerList = providerList;
- },
- fail: (e) => {
- console.log("获取支付通道失败:", e);
- }
- });
- // #endif
- },
- methods: {
- loginMpWeixin() {
- return new Promise((resolve, reject) => {
- uni.login({
- provider: 'weixin',
- success(res) {
- console.warn('此处使用uni-id处理微信小程序登录,详情参考: https://uniapp.dcloud.net.cn/uniCloud/uni-id')
- uni.request({
- url: 'https://97fca9f2-41f6-449f-a35e-3f135d4c3875.bspapp.com/http/user-center',
- method: 'POST',
- data: {
- action: 'loginByWeixin',
- params: {
- code: res.code,
- platform: 'mp-weixin'
- }
- },
- success(res) {
- if (res.data.code !== 0) {
- reject(new Error('获取openid失败:', res.result.msg))
- return
- }
- uni.setStorageSync('openid', res.data.openid)
- resolve(res.data.openid)
- },
- fail(err) {
- reject(new Error('获取openid失败:' + err))
- }
- })
- },
- fail(err) {
- reject(err)
- }
- })
- })
- },
- async weixinPay() {
- let openid = uni.getStorageSync('openid')
- console.log("发起支付");
- this.loading = true;
- if (!openid) {
- try {
- openid = await this.loginMpWeixin()
- } catch (e) {
- console.error(e)
- }
- if (!openid) {
- uni.showModal({
- content: '获取openid失败',
- showCancel: false
- })
- this.loading = false
- return
- }
- }
- this.openid = openid
- let orderInfo = await this.getOrderInfo('wxpay')
- if (!orderInfo) {
- uni.showModal({
- content: '获取支付信息失败',
- showCancel: false
- })
- return
- }
- uni.requestPayment({
- ...orderInfo,
- success: (res) => {
- uni.showToast({
- title: "感谢您的赞助!"
- })
- },
- fail: (res) => {
- uni.showModal({
- content: "支付失败,原因为: " + res
- .errMsg,
- showCancel: false
- })
- },
- complete: () => {
- this.loading = false;
- }
- })
- },
- async requestPayment(e, index) {
- this.providerList[index].loading = true;
- const provider = e.id
- let orderInfo = await this.getOrderInfo(provider);
- if (!orderInfo) {
- uni.showModal({
- content: '获取支付信息失败',
- showCancel: false
- })
- return
- }
- console.log('--------orderInfo--------')
- console.log(orderInfo);
- uni.requestPayment({
- provider,
- orderInfo: orderInfo,
- success: (e) => {
- console.log("success", e);
- uni.showToast({
- title: "感谢您的赞助!"
- })
- },
- fail: (e) => {
- console.log("fail", e);
- uni.showModal({
- content: "支付失败,原因为: " + e.errMsg,
- showCancel: false
- })
- },
- complete: () => {
- this.providerList[index].loading = false;
- }
- })
- },
- getOrderInfo(provider) {
- return new Promise((resolve, reject) => {
- if (!this.price) {
- reject(new Error('请输入金额'))
- }
- console.warn('此处使用uni-pay处理支付,详情参考: https://uniapp.dcloud.io/uniCloud/unipay')
- uni.request({
- method: 'POST',
- url: 'https://97fca9f2-41f6-449f-a35e-3f135d4c3875.bspapp.com/http/pay',
- data: {
- provider,
- openid: this.openid,
- totalFee: Number(this.price) * 100, // 转为以分为单位
- // #ifdef APP-PLUS
- platform: 'app-plus',
- // #endif
- // #ifdef MP-WEIXIN
- platform: 'mp-weixin',
- // #endif
- },
- success(res) {
- if (res.data.code === 0) {
- resolve(res.data.orderInfo)
- } else {
- reject(new Error('获取支付信息失败' + res.data.msg))
- }
- },
- fail(err) {
- reject(new Error('请求支付接口失败' + err))
- }
- })
- })
- },
- priceChange(e) {
- console.log(e.detail.value)
- this.price = e.detail.value;
- }
- }
- }
- </script>
- <style>
- .rmbLogo {
- font-size: 40rpx;
- }
- button {
- background-color: #007aff;
- color: #ffffff;
- }
- .uni-h1.uni-center {
- display: flex;
- flex-direction: row;
- justify-content: center;
- align-items: flex-end;
- }
- .price {
- border-bottom: 1px solid #eee;
- width: 200rpx;
- height: 80rpx;
- padding-bottom: 4rpx;
- }
- .ipaPayBtn {
- margin-top: 30rpx;
- }
- </style>
|