• uni-app实现支付及项目打包上传


            本文主要介绍uni-app项目中如何实现支付功能(支付宝支付、微信支付),及项目如何打包上传。

    一、实现支付

            前置工作,项目要实现支付功能,首先要在根目录manifest.json文件内App模块配置中进行设置。

    其中,appid需要登录微信开放平台加移动应用,审核通过后可获取应用ID(AppID,支付订单中需要使用)。

    1.1 支付宝支付

            登录 支付宝开放平台 ,进入控制台页面创建移动应用,填写应用信息并提交审核,在应用详情页面的能力列表中添加APP支付功能,进入开发设置完成加密方式、IP白名单等开发信息,设置添加功能和配置密钥后(获取公钥、私钥,用于服务器生成订单),将应用提交审核,详情参考上线应用应用上线后,完成签约才能在生产环境使用支付功能。

            主要步骤如下:

    1.获取支付厂商 uni.getProvider({service:"payment"});

    2.用户发起支付 requestPayment(item,index){};

    3.获取订单信息 getOrderInfo(item.id);

    4.发起支付api。

    详细代码如下:

    1. <template>
    2. <view>
    3. <view class="title">支付</view>
    4. <view>
    5. 支付金额:
    6. <input :value="price" maxlength="4" @input="priceChange" placeholder="请输入支付金额" />
    7. <view>
    8. <!-- #ifdef APP-PLUS -->
    9. <button size="mini" type="primary" v-for="(item,index) in providerList" :key="item.id" :loading="item.loading" @click="requestPayment(item,index)">{{item.name}}支付</button>
    10. <!-- #endif -->
    11. </view>
    12. </view>
    13. </view>
    14. </template>
    15. <script>
    16. export default {
    17. data() {
    18. return {
    19. price: 1,
    20. providerList: [], //支付厂商,微信、支付宝
    21. openid: '', //用户id
    22. }
    23. },
    24. onLoad() {
    25. var that = this;
    26. //获取支付厂商
    27. uni.getProvider({
    28. service: 'payment',
    29. success: (e) => {
    30. console.log(JSON.stringify(e));
    31. var provider = e.provider;
    32. //映射一个格式(添加loading是否加载中)
    33. that.providerList = provider.map(item => {
    34. if (item === "apipay") {
    35. return {
    36. name: "支付宝",
    37. id: item,
    38. loading: false
    39. }
    40. } else if (item === "wxpay") {
    41. return {
    42. name: "微信",
    43. id: item,
    44. loading: false
    45. }
    46. }
    47. })
    48. }
    49. })
    50. },
    51. methods: {
    52. //实现支付
    53. async requestPayment(item, index) {
    54. //显示加载中
    55. item.loading = true;
    56. //获取订单信息
    57. let orderInfo = await this.getOrderInfo(item.id);
    58. //发起支付
    59. uni.requestPayment({
    60. provider: item.id, //提供商
    61. orderInfo: orderInfo, //订单信息
    62. //成功提示
    63. success: (e) => {
    64. console.log("success", e);
    65. uni.showToast({
    66. title: "感谢您的赞助!"
    67. })
    68. },
    69. //失败
    70. fail: (e) => {
    71. console.log("fail", e);
    72. },
    73. //停止加载中
    74. complete: () => {
    75. item.loading = false;
    76. }
    77. })
    78. },
    79. //获取订单信息
    80. getOrderInfo(provider) {
    81. //返回一个promiase
    82. return new Promise((resolve, reject) => {
    83. //请求订单信息
    84. uni.request({
    85. method: 'POST',
    86. url: 'https://97fca9f2-41f6-449f-a35e-3f135d4c3875.bspapp.com/http/pay',
    87. data: {
    88. provider, //支付厂商
    89. openid: this.openid, //openid(微信支付用)
    90. totalFee: Number(this.price) * 100, // 转为以为单位
    91. platform: 'app-plus', //平台
    92. },
    93. success(res) {
    94. if (res.data.code === 0) {
    95. // 返回订单信息
    96. resolve(res.data.orderInfo)
    97. } else {
    98. // 失败
    99. reject(new Error('获取支付信息失败' + res.data.msg))
    100. }
    101. },
    102. fail(err) {
    103. // 请求失败
    104. reject(new Error('请求支付接口失败' + err))
    105. }
    106. })
    107. })
    108. },
    109. priceChange(e){
    110. this.price=e.detail.value;
    111. }
    112. }
    113. }
    114. </script>

    1.2 微信支付

            实现微信支付除了在微信平台获取appid外,还需要使用商户号和登录密码登录微信商户平台,进入 “账户中心” > “API安全” > “设置APIv2密钥” 设置API密钥(用于服务器生成订单),详情参考API证书及密钥。没有商户号,此步骤就不演示了,重点放在实现支付的代码上。

            主要步骤如下:

    1. 用户点击发起支付 async weixinpay();

    2. 获取openid 本地||loginMPweixin;

            2.1 获取code uni.login();

            2.2 获取openid uni.request({});

    3. 获取订单信息 this.getOrderInfo('wxpay');

    4. 根据订单信息发起支付 uni.requestPayment({...orderInfo})。

    详细代码如下:

    1. <template>
    2. <view>
    3. <view class="title">支付</view>
    4. <view>
    5. 支付金额:
    6. <input :value="price" maxlength="4" @input="priceChange" placeholder="请输入支付金额" />
    7. <view>
    8. <!-- #ifdef MP-WEIXIN-->
    9. <button type="primary" size="mini" @click="weixinPay" :loading="loading">小程序微信支付</button>
    10. <!-- #endif -->
    11. </view>
    12. </view>
    13. </view>
    14. </template>
    15. <script>
    16. export default {
    17. data() {
    18. return {
    19. price: 1,
    20. loading:false
    21. }
    22. },
    23. methods: {
    24. async weixinPay(){
    25. this.loading-true;//加载中
    26. //获取openid
    27. let openid=uni.getStorageInfoSync('openid');
    28. if(!openid){
    29. //执行登录获取openid
    30. openid=await this.loginMpWeixin();
    31. this.openid=openid;
    32. }
    33. //获取订单信息
    34. let orderInfo=await this.getOrderInfo('wxpay');
    35. //如果没有订单信息,弹出订单信息失败
    36. if(!orderInfo){
    37. uni.showModal({
    38. content:"获取订单信息失败",
    39. showCancel:false
    40. })
    41. return
    42. }
    43. //发起支付
    44. uni.requestPayment({
    45. ...orderInfo,
    46. //成功
    47. success:(res)=>{
    48. uni.showToast({
    49. title:"感谢您的赞助!"
    50. })
    51. },
    52. //失败
    53. fail: (res) => {
    54. content:"支付失败,原因为:"+res.errMsg;
    55. showCancel:false
    56. },
    57. //移除loading
    58. complete: () => {
    59. this.loading=false;
    60. }
    61. })
    62. },
    63. loginMpWeixin(){
    64. //返回一个promise
    65. return new Promise((resolve,reject)=>{
    66. uni.login({
    67. provider:'weixin',
    68. success: (res) => {
    69. //login成功后会得到一个code
    70. //请求后端的登录
    71. uni.request({
    72. url:"https://97fca9f2-41f6-449f-a35e-3f135d4c3875.bspapp.com/http/user-center",
    73. method:'POST',
    74. data:{
    75. action:'loginByWeixin',
    76. params:{
    77. code:res.code,//传入code
    78. platform:'mp-weixin'
    79. }
    80. },
    81. success: (res) => {
    82. if(res.data.code!=0){
    83. reject(new Error('获取openid失败:',res.result.msg))
    84. return
    85. }
    86. //成功后存储openid
    87. uni.setStorageSync('openid',res.data.openid);
    88. //返回openid
    89. resolve(res.data.openid);
    90. },
    91. fail(err) {
    92. reject(new Error('获取openid失败:'+err));
    93. }
    94. })
    95. }
    96. })
    97. })
    98. },
    99. priceChange(e){
    100. this.price=e.detail.value;
    101. }
    102. }
    103. }
    104. </script>

    二、项目打包上传

            这是uni-app项目上线的最后一步,本着一处编码,多端使用的突出优势,项目打包有以下几种方式。

    2.1 H5端打包上传

            配置相对地址 manifest.json web配置 运行的基础路径 

            修改完后,点击工具栏->发行->网站pc web或手机 。

     弹出弹窗,修改网站标题于网站域名(网站域名取对应项目的域名,一般为https/http开头)填完后直接点击发行。

            发行成功后,在项目根目录下会自动生成unpackage文件夹,unpackage --> dist --> build --> h5 文件夹, 在外部资源中打开,将 h5 文件夹打包成 zip 格式,然后给到运维,运维会帮忙发布到服务器,发布成功后,运维会给你一个属于 h5 项目的域名 https://xxxx.xxx.com/app/ 拿取H5域名去拼接页面,就能在浏览器中打开对应的页面了。 

    2.2 微信小程序打包上传

            主要步骤有以下几个方面:

    1. 配置id  manifest.json 微信小程序配置

    2. 单击发行 发行->小程序微信

     

    3. 进入小程序上传小程序右上角上传(先测试,真机测试)

     4. 微信提交审核 (mp.weixin.qq.com),进入网站,版本管理-->审核-->审核通过发布,一定要认真填写隐私协议,至关重要,否则大部分时间要花费在这一步上。

    5. 网络请求配置域名必须是https开头, 开发管理-->服务器设置-->服务器域名

        request合法域名:uni.request,wx.request 请求的域名必须事先定义好;

        uploadFile合法域名:如果有上传也要配置上传的域名;

        downloadFile合法域名:配置下载域名。

    2.3 应用商店打包上传

            当前主流的应用商店有华为、oppo、vivo、小米等。在众多应用商店中,目前仅华为一家允许个人身份进行上传App,其他商店都需要公司身份。打包上传需要提供app的版权证明;在这个过程中最重要的是应对国家的隐私条例,以及应用商店的隐私审核。

            主要步骤有以下几点:

    1. 在manifest.json中进行设置

    App图标配置

     2. 发行-->源生app-云打包

    3.勾选打包配置

     4. 点击打包,在控制台中查看进度

    5. 点击链接下载 apk 的安装包,并安装到 Android 手机中查看打包的效果。 

            如果整理的内容对你有用,欢迎收藏转发。

  • 相关阅读:
    第67章 完整定义nopCommerce Jquery DataTable插件之初始化查询表单
    昇思25天学习打卡营第01天|imdeity
    docker使用详解
    学习使用JS实现Echarts的图表保存为图片功能:saveAsImage和getDataURL
    opencv图像的本质
    为什么要做数据治理以及如何进行数据治理?
    Qt5开发从入门到精通——第四篇(标准字体对话框类 getFont())
    DSPE-PEG-NYZL1,NYZL1-PEG-DSPE,磷脂-聚乙二醇-靶向肽NYZL1,小分子靶向肽
    《STM32 HAL库》RCC 相关系列函数详尽解析—— HAL_RCC_OscConfig()
    更换Eclipse的JDK版本
  • 原文地址:https://blog.csdn.net/zhangxiaobai___/article/details/128141184