1. 从零开始:支付平台配置与沙箱环境调试
最近接手了一个电商类的Uniapp项目,老板催得紧,要求一个月内必须上线,而支付功能是重中之重。说实话,第一次在Uniapp里同时搞微信和支付宝支付,心里还是有点打鼓的,毕竟这玩意儿涉及真金白银,出点差错可不是闹着玩的。我的策略很明确:先跑通沙箱,再谈上线。沙箱环境就是支付平台的“游乐场”,在这里你可以尽情测试,扣款都是虚拟的,哪怕把流程玩崩了也没关系。这一步走稳了,后面才能少踩坑。
1.1 微信支付:商户号、证书与沙箱的“三重门”
微信支付的配置,第一步就是搞定商户平台。你得先有个公司主体,完成企业认证,交300块认证费。拿到商户号(MCHID)之后,别急着写代码,先去看看“产品中心”,把“APP支付”功能开通了。这里有个细节很容易被忽略:支付授权目录。你得把你Uniapp项目最终发布H5的域名配上去,不然支付调不起来。我当初就因为这个,在H5端调试了半天,一直报“当前页面的URL未注册”。
接下来是密钥和证书,这是安全的核心。微信支付现在主要推荐使用APIv3,它用的是API密钥和商户API证书。在商户平台的“账户中心”->“API安全”里,你可以设置API密钥(一个32位的字符串,务必妥善保存)。然后,你需要生成商户API证书,这个过程稍微复杂点:先在平台下载一个证书工具,用它生成一个私钥和证书请求文件(CSR),再把CSR上传到平台,最后下载平台颁发的证书文件(.pem格式)。私钥文件(apiclient_key.pem)千万不能泄露,它和API密钥是你服务端签名的两把钥匙。
最关键的实战环节来了:沙箱环境调试。微信支付专门为开发者提供了沙箱环境,地址是 https://api.mch.weixin.qq.com/sandboxnew。你需要先用你的商户号,调用专门的接口获取沙箱环境的API密钥。然后,你就可以用这个沙箱密钥,在沙箱环境下调用“统一下单”等所有接口了。我强烈建议你写一个简单的Node.js脚本或者用Postman,先把“统一下单”接口调通。重点看返回的prepay_id和签名是否正确。这里最容易出错的点是签名算法,APIv3用的是HMAC-SHA256,参数要按照特定规则排序并拼接成字符串后再签名。我建议你直接使用微信支付官方提供的SDK,能省去很多自己处理签名的麻烦。
1.2 支付宝支付:应用、密钥与IP白名单
支付宝开放平台的流程相对清晰一些。首先创建应用,选择“APP应用”类型,提交营业执照等信息审核。审核通过后,你会拿到一个APPID。接着在“功能列表”里添加“APP支付”功能并签约。
安全配置方面,支付宝使用的是RSA2(2048位)签名。你需要用工具(比如OpenSSL)生成一对RSA密钥:app_private_key.pem(应用私钥)和app_public_key.pem(应用公钥)。然后,把应用公钥上传到支付宝开放平台的“应用信息”->“接口加签方式”里。上传后,支付宝会给你一个支付宝公钥,这个公钥是用来在你的服务端验证支付宝回调通知的签名的,务必下载保存好。
还有一个特别重要的安全设置是IP白名单。在支付宝开放平台的应用设置里,找到“接口加签管理”,你可以配置你服务端出口IP。这意味着,只有来自这个IP的请求,支付宝才会认为是合法的。这能有效防止支付请求被伪造。我建议在沙箱测试阶段就把测试服务器的IP配上去,不然调用接口会直接报错。
支付宝的沙箱环境体验很好,你可以在“沙箱应用”里找到一个默认的测试账号,里面有余额和银行卡信息,直接用来测试支付流程。调试时,重点关注服务端生成的orderString是否正确,以及前端用这个orderString调用支付宝SDK后,是否能正常唤起支付。
2. Uniapp项目集成:多端适配与初始化踩坑记
支付平台那边配置好了,接下来就是要在Uniapp项目里把它们接进来。Uniapp的跨端特性在这里既是优势也是挑战,因为App、小程序、H5的支付调用方式各有不同,但框架提供了统一的API,我们需要做的就是正确配置和适配。
2.1 原生插件配置与支付能力检测
如果你要编译到App(iOS和Android),那么原生支付插件是必须的。在HBuilderX里,打开项目的manifest.json文件,找到“App模块配置”,勾选“Payment(支付)”。但这只是基础模块,具体到微信支付和支付宝支付,你需要配置原生插件SDK。
对于微信支付,你通常需要去微信开放平台下载iOS和Android的SDK,然后放到Uniapp项目的原生插件目录下,并在manifest.json的“App SDK配置”里进行配置。不过,更省心的办法是使用HBuilderX提供的云端原生插件,直接在插件市场搜索“微信支付”或“支付宝支付”,选择官方或高评分的插件,按照文档配置appid、mchid等参数即可。我实测过几个,稳定性都不错。
配置好后,在应用启动时,一定要动态检测设备是否支持某种支付方式。你不能假设用户手机一定装了微信或支付宝。使用uni.getProvider API可以轻松做到:
uni.getProvider({
service: 'payment',
success: function (res) {
console.log('支持的支付方式:', res.provider);
// res.provider 是一个数组,可能包含 ['wxpay', 'alipay']
if (res.provider.indexOf('wxpay') === -1) {
// 可以隐藏微信支付按钮,或提示用户安装微信
this.wxpayAvailable = false;
}
}
});
2.2 支付页面设计与防重复提交
支付页面看似简单,但交互细节很重要。金额输入框要限制只能输入数字和一个小数点,并且通常要固定小数点后两位。你可以用<input type="digit">,但为了更精细的控制,我更喜欢用监听@input事件来处理:
<template>
<view>
<input v-model="amount" @input="onAmountInput" placeholder="请输入金额" />
<button :disabled="payButtonDisabled" @click="handlePay('wxpay')">微信支付</button>
<button :disabled="payButtonDisabled" @click="handlePay('alipay')">支付宝支付</button>
</view>
</template>
<script>
export default {
data() {
return {
amount: '',
payButtonDisabled: false // 防止重复点击
};
},
methods: {
onAmountInput(e) {
// 只允许数字和一个小数点
let value = e.detail.value.replace(/[^\d.]/g, '');


1693

被折叠的 条评论
为什么被折叠?



