| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511 | import sheep from '@/sheep';// #ifdef H5import $wxsdk from '@/sheep/libs/sdk-h5-weixin';// #endifimport {	getRootUrl} from '@/sheep/helper';import PayOrderApi from '@/sheep/api/pay/order';/** * 支付 * * @param {String} payment = ['wechat','alipay','wallet','mock']  	- 支付方式 * @param {String} orderType = ['goods','recharge','groupon']  	- 订单类型 * @param {String} id					- 订单号 * @param {String} orderType2 = ['1','2']  	- 中星订单类型,1商品 2消费分充值	 */export default class SheepPay {	constructor(payment, orderType, id, orderType2) {		this.payment = payment;		this.id = id;		this.orderType = orderType;		this.orderType2 = orderType2;		this.payAction();			}	payAction() {		const payAction = {						WechatOfficialAccount: {				wechat: () => {					this.wechatOfficialAccountPay();				},				JSAPI:() => {										this.fuYouWechatOfficialAccountPay();				},				alipay: () => {					this.redirectPay(); // 现在公众号可以直接跳转支付宝页面				},				wallet: () => {					this.walletPay();				},				mock: () => {					this.mockPay();				},				wx_pub:() => {					payAction.WechatOfficialAccount.wechat();				}			},			WechatMiniProgram: {				wechat: () => {					this.wechatMiniProgramPay();				},				JSAPI:() => {					this.fuYouWechatOfficialAccountPay();				},				alipay: () => {					this.copyPayLink();				},				wallet: () => {					this.walletPay();				},				mock: () => {					this.mockPay();				},				wx_pub:() => {					this.wechatMiniProgramPay();				}							},			App: {				wechat: () => {					this.wechatAppPay();				},				JSAPI:() => {					this.fuYouWechatOfficialAccountPay();				},				alipay: () => {					this.alipay();				},				wallet: () => {					this.walletPay();				},				mock: () => {					this.mockPay();				}			},			H5: {				wechat: () => {					this.wechatWapPay();				},				JSAPI:() => {					this.fuYouWechatOfficialAccountPay();				},				alipay: () => {					this.redirectPay();				},				wallet: () => {					this.walletPay();				},				mock: () => {					this.mockPay();				},				wx_pub:() => {					payAction.WechatOfficialAccount.wechat();				}			},		};		// console.log(payAction[sheep.$platform.name],this.payment)		return payAction[sheep.$platform.name][this.payment]();	}	// 预支付	prepay(channel) {				return new Promise(async (resolve, reject) => {			let data = {				id: this.id,				channelCode: channel,				channelExtras: {},				orderType:this.orderType2			};			// 特殊逻辑:微信公众号、小程序支付时,必须传入 openid			if (['wx_pub', 'wx_lite'].includes(channel)) {				const openid = await sheep.$platform.useProvider('wechat').getOpenid(true);								// 如果获取不到 openid,微信无法发起支付,此时需要引导				if (!openid) {					this.bindWeixin();					return;				}								data.channelExtras.openid = openid;			}						// 发起预支付 API 调用			PayOrderApi.submitOrder(data).then((res) => {				// 成功时				res.code === 0 && resolve(res);				// 失败时				if (res.code !== 0 && res.msg.indexOf('无效的openid') >= 0) {					// 特殊逻辑:微信公众号、小程序支付时,必须传入 openid 不正确的情况					if (res.msg.indexOf('无效的openid') >= 0 // 获取的 openid 不正确时,或者随便输入了个 openid						||						res.msg.indexOf('下单账号与支付账号不一致') >= 0					){ // https://developers.weixin.qq.com/community/develop/doc/00008c53c347804beec82aed051c00						this.bindWeixin();					}				}			});		});	}	// 富友预支付	fuYouPrePay(channel) {		return new Promise(async (resolve, reject) => {			let data = {				id: this.id,				channelCode:channel,				orderType:this.orderType2,				req: {					trade_type: channel,				}			};			// 特殊逻辑:微信公众号、小程序支付时,必须传入 openid			if (['wx_pub', 'wx_lite','JSAPI'].includes(channel)) {				const openid = await sheep.$platform.useProvider('wechat').getOpenid(true);				// 如果获取不到 openid,微信无法发起支付,此时需要引导				if (!openid) {					this.bindWeixin();					return;				}				data.req.sub_openid = openid;			}			// console.log("富友支付",data)			// 发起预支付 API 调用			PayOrderApi.fuYouSubmitOrder(data).then((res) => {				// 成功时				res.code === 0 && resolve(res);				// 失败时				if (res.code !== 0 && res.msg.indexOf('无效的openid') >= 0) {					// 特殊逻辑:微信公众号、小程序支付时,必须传入 openid 不正确的情况					if (res.msg.indexOf('无效的openid') >= 0 // 获取的 openid 不正确时,或者随便输入了个 openid						||						res.msg.indexOf('下单账号与支付账号不一致') >= 0					) { // https://developers.weixin.qq.com/community/develop/doc/00008c53c347804beec82aed051c00						this.bindWeixin();					}				}			});		});	}	// #ifdef H5	// 富友微信公众号 JSSDK 支付	async fuYouWechatOfficialAccountPay(orderType2) {		// console.log("富友微信公众号 JSSDK 支付");		let {			code,			data		} = await this.fuYouPrePay('JSAPI');		if (code !== 0) {			return;		}		let newJsonString = data.replace(/"sdk_package":/g, '"packageValue":');		const payConfig = JSON.parse(newJsonString);		// console.log('payConfig',payConfig);		// return;				$wxsdk.wxpay(payConfig, {			success: () => {				this.payResult('success');			},			cancel: () => {				sheep.$helper.toast('支付已手动取消');			},			fail: (error) => {								if (error.errMsg.indexOf('chooseWXPay:没有此SDK或暂不支持此SDK模拟') >= 0) {					sheep.$helper.toast('发起微信支付失败,原因:可能是微信开发者工具不支持,建议使用微信打开网页后支付');					return				}				this.payResult('fail');			},		});	}	// 微信公众号 JSSDK 支付	async wechatOfficialAccountPay(orderType2) {		let {			code,			data		} = await this.prepay('wx_pub');		if (code !== 0) {			return;		}		const payConfig = JSON.parse(data.displayContent);				$wxsdk.wxpay(payConfig, {			success: () => {				this.payResult('success');			},			cancel: () => {				sheep.$helper.toast('支付已手动取消');			},			fail: (error) => {				if (error.errMsg.indexOf('chooseWXPay:没有此SDK或暂不支持此SDK模拟') >= 0) {					sheep.$helper.toast('发起微信支付失败,原因:可能是微信开发者工具不支持,建议使用微信打开网页后支付');					return				}				this.payResult('fail');			},		});	}	// 浏览器微信 H5 支付 TODO 非繁人:待接入	async wechatWapPay() {		const {			error,			data		} = await this.prepay();		if (error === 0) {			const redirect_url =				`${getRootUrl()}pages/pay/result?id=${this.id}&payment=${this.payment}&orderType=${this.orderType}`;			location.href = `${data.pay_data.h5_url}&redirect_url=${encodeURIComponent(redirect_url)}`;		}	}	// 支付链接  TODO 非繁人:待接入	async redirectPay() {		let {			error,			data		} = await this.prepay();		if (error === 0) {			const redirect_url =				`${getRootUrl()}pages/pay/result?id=${this.id}&payment=${this.payment}&orderType=${this.orderType}`;			location.href = data.pay_data + encodeURIComponent(redirect_url);		}	}	// #endif	// 微信小程序支付	async wechatMiniProgramPay() {		// let that = this;		let {			code,			data		} = await this.prepay('wx_lite');		if (code !== 0) {			return;		}		// 调用微信小程序支付		const payConfig = JSON.parse(data.displayContent);		uni.requestPayment({			provider: 'wxpay',			timeStamp: payConfig.timeStamp,			nonceStr: payConfig.nonceStr,			package: payConfig.packageValue,			signType: payConfig.signType,			paySign: payConfig.paySign,			success: (res) => {				this.payResult('success');			},			fail: (err) => {				if (err.errMsg === 'requestPayment:fail cancel') {					sheep.$helper.toast('支付已手动取消');				} else {					this.payResult('fail');				}			},		});	}	// 余额支付	async walletPay() {		const {			code		} = await this.prepay('wallet');		code === 0 && this.payResult('success');	}	// 模拟支付	async mockPay() {		const {			code		} = await this.prepay('mock');		code === 0 && this.payResult('success');	}	// 支付宝复制链接支付  TODO 非繁人:待接入	async copyPayLink() {		let that = this;		let {			error,			data		} = await this.prepay();		if (error === 0) {			// 引入showModal 点击确认 复制链接;			uni.showModal({				title: '支付宝支付',				content: '复制链接到外部浏览器',				confirmText: '复制链接',				success: (res) => {					if (res.confirm) {						sheep.$helper.copyText(data.pay_data);					}				},			});		}	}	// 支付宝支付  TODO 非繁人:待接入	async alipay() {		let that = this;		const {			error,			data		} = await this.prepay();		if (error === 0) {			uni.requestPayment({				provider: 'alipay',				orderInfo: data.pay_data, //支付宝订单数据				success: (res) => {					that.payResult('success');				},				fail: (err) => {					if (err.errMsg === 'requestPayment:fail [paymentAlipay:62001]user cancel') {						sheep.$helper.toast('支付已手动取消');					} else {						that.payResult('fail');					}				},			});		}	}	// 微信支付  TODO 非繁人:待接入	async wechatAppPay() {		let that = this;		let {			error,			data		} = await this.prepay();		if (error === 0) {			uni.requestPayment({				provider: 'wxpay',				orderInfo: data.pay_data, //微信订单数据(官方说是string。实测为object)				success: (res) => {					that.payResult('success');				},				fail: (err) => {					err.errMsg !== 'requestPayment:fail cancel' && that.payResult('fail');				},			});		}	}	// 支付结果跳转,success:成功,fail:失败	payResult(resultType) {		// console.log(this.id)		sheep.$router.redirect('/pages/pay/resultYuan', {			id: this.id,			orderType: this.orderType,			payState: resultType		});	}	// 引导绑定微信	bindWeixin() {		uni.showModal({			title: '微信支付',			content: '请先绑定微信再使用微信支付',			confirmText: '绑定',			success: function(res) {				if (res.confirm) {					sheep.$platform.useProvider('wechat').bind();				}			},		});	}}export function getPayMethods(channels) {	// console.log("来拿支付渠道",channels)	let payMethods = [		{			icon: '/static/images/wechat.png',			title: '微信支付',			value: 'wx_pub',			disabled: false,		},		{			icon: '/static/images/wechat.png',			title: '微信支付',			value: 'JSAPI',			disabled: false,		},		{			icon: '/static/images/alipay.png',			title: '支付宝支付',			value: 'alipay',			disabled: false,		},		{		  icon: '/static/images/wallet.png',		  title: '余额支付',		  value: 'wallet',		  disabled: false,		},		{		  icon: '/static/images/apple.png',		  title: 'Apple Pay',		  value: 'apple',		  disabled: false,		},		{		  icon: '/static/images/wallet.png',		  title: '模拟支付',		  value: 'mock',		  disabled: false,		}	];	const platform = sheep.$platform.name	// 1. 处理【微信支付】	const wechatMethod = payMethods[0];	if ((platform === 'WechatOfficialAccount' && channels.includes('wx_pub')) ||		(platform === 'WechatMiniProgram' && channels.includes('wx_lite')) ||		(platform === 'App' && channels.includes('wx_app'))) {		wechatMethod.disabled = false;	}	// 2. 处理【支付宝支付】	const alipayMethod = payMethods[1];	if ((platform === 'WechatOfficialAccount' && channels.includes('alipay_wap')) ||		platform === 'WechatMiniProgram' && channels.includes('alipay_wap') ||		platform === 'App' && channels.includes('alipay_app')) {		alipayMethod.disabled = false;			}	// 3. 处理【余额支付】	const walletMethod = payMethods[2];	if (channels.includes('wallet')) {	  walletMethod.disabled = false;	}	// 4. 处理【苹果支付】TODO 非繁人:未来接入	// 5. 处理【模拟支付】	const mockMethod = payMethods[4];	if (channels.includes('mock')) {	  mockMethod.disabled = false;	}	function filterPayMethods(payMethods, channels) {	    for (let i = payMethods.length - 1; i >= 0; i--) {	        if (!channels.includes(payMethods[i].value)) {	            payMethods.splice(i, 1);	        }	    }	}	// 示例:channels 只包含 'wechat' 和 'alipay'	filterPayMethods(payMethods,channels);	console.log(payMethods)	return payMethods;}
 |