uni-app 微信支付-小程序、APP、IOS

news2025/4/6 7:17:52

小程序 支付

先看官方文档 https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_8_2.shtml

知晓有那些比不可少的流程,之后后端确定返回的参数值,用于前端支付。参数值必须一一对应,不然支付会失败

   uni.requestPayment({
        timeStamp: data.timeStamp, //当前的时间
        nonceStr: data.nonceStr, //随机字符串
        package: data.package, //统一下单接口返回的 prepay_id 参数值
        signType: data.signType, //签名算法,暂支持 MD5。
        paySign: data.paySign, //签名
        success(res) {
            console.log('成功', res);    
        },
        fail: (res) => {
            console.log('失败', res);
        },
})

小程序支付相对简单。支付的订单信息多要在后端生成。返回订单信息给前端调用支付API

APP支付

app支付方法和小程序基本相同,就是app要配置的地方不少

还是先看开发官方文档,基础的准备好。https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_4.shtml

之后在uni的目录中找到manifest.json 打开 选择app模卡–支付前面打个勾
在这里插入图片描述
这边只对微信支付,所以微信支付勾上 ,把微信平台的appid 放到对应的输入框里面

    //获取服务供应商
    uni.getProvider({
        service: 'payment',
        success: (res) => {
            console.log('getProvider', res) //服务类型:payment
            console.log('服务类型', res.provider) //返回的是 微信 支付宝
            //在这里请求接口拿到返回的订单数据 用于调起支付
            that.sponsorPro(res.data) // 支付 res.data 为后端返回的订单信息
            //这个判断 是否有微信 不要加 真机调试不会过 测试可以过
            if(res.provider.indexOf('wxpay')){}
        }
    })

发起支付

md5().toUpperCase() 截取签名前30位为 小写转大写

md5为单独的一个js,代码在最后

sponsorPro(data) {
    //data 为后端的参数
    let info = {
        "appid": data.appId,
        "partnerid": data.mchid,
        "package": 'Sign=WXPay',
        "package": data.package,
        "noncestr": data.noncestr,
        "timestamp": data.timestamp,
        // "sign": data.paySign,
        "sign": md5(data.sign).toUpperCase(),
        }
    console.log('发起支付', info);
    uni.requestPayment({
        provider: 'wxpay',
        signType: "MD5",
        orderInfo: info,
        success(res) {
            console.log('成功:' + JSON.stringify(res));
        },
        fail(err) {
            console.log('失败:' + JSON.stringify(err));
        }
    })
}

info 的参数 和官方返回的参数必须一致
在这里插入图片描述

if (plus.runtime.isApplicationExist({
            pname: 'com.tencent.mm',
            action: 'weixin://'
    })) {
        console.log("微信应用已安装");
    } else {
        console.log("微信应用未安装");
}

可以用上面这个判断微信是否安装

官方地址 http://www.html5plus.org/doc/zh_cn/runtime.html#plus.runtime.isApplicationExist

微信支付调用失败 [payment微信:-1]General errors",“errCode”:-100,“code”:-100
payment微信:-1 是微信的错误代码提示

“errCode”:-100," code":-100 为uni-app 错误代码提示

特别要注意第一次提交时报的是什么错误,这样对症下药

要是提示: 包名(签名)与开放平台包名(签名)不一致 ,先检查打包的包名(签名)是什么,然后对比与线上的名字一致
在这里插入图片描述
在这里插入图片描述
app签名查看工具
下载地址 https://developers.weixin.qq.com/doc/oplatform/Downloads/Android_Resource.html
在这里插入图片描述
下载安装到手机 打开 输入包名 签名

要先打包,把你需要获取签名的包安装到手机上,然后安装签名获取工具打开输入包名
在这里插入图片描述

ios支付

要先创建一个uni-app 账号 开通 云服务空间和开通前端网页托管

详情看官方流程 https://uniapp.dcloud.io/api/plugins/universal-links
在这里插入图片描述
在添加域名时报—设置一个三级域名就好
在这里插入图片描述
附:md5.js源码

在页面中引用 import md5 from ‘…/…/common/md5.js’

form 后面为存放地址

/*
 * JavaScript MD5
 * https://github.com/blueimp/JavaScript-MD5
 *
 * Copyright 2011, Sebastian Tschan
 * https://blueimp.net
 *
 * Licensed under the MIT license:
 * https://opensource.org/licenses/MIT
 *
 * Based on
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
 * Digest Algorithm, as defined in RFC 1321.
 * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for more info.
 */

/* global define */

;(function ($) {
  'use strict'

  /*
  * Add integers, wrapping at 2^32. This uses 16-bit operations internally
  * to work around bugs in some JS interpreters.
  */
  function safeAdd (x, y) {
    var lsw = (x & 0xffff) + (y & 0xffff)
    var msw = (x >> 16) + (y >> 16) + (lsw >> 16)
    return (msw << 16) | (lsw & 0xffff)
  }

  /*
  * Bitwise rotate a 32-bit number to the left.
  */
  function bitRotateLeft (num, cnt) {
    return (num << cnt) | (num >>> (32 - cnt))
  }

  /*
  * These functions implement the four basic operations the algorithm uses.
  */
  function md5cmn (q, a, b, x, s, t) {
    return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b)
  }
  function md5ff (a, b, c, d, x, s, t) {
    return md5cmn((b & c) | (~b & d), a, b, x, s, t)
  }
  function md5gg (a, b, c, d, x, s, t) {
    return md5cmn((b & d) | (c & ~d), a, b, x, s, t)
  }
  function md5hh (a, b, c, d, x, s, t) {
    return md5cmn(b ^ c ^ d, a, b, x, s, t)
  }
  function md5ii (a, b, c, d, x, s, t) {
    return md5cmn(c ^ (b | ~d), a, b, x, s, t)
  }

  /*
  * Calculate the MD5 of an array of little-endian words, and a bit length.
  */
  function binlMD5 (x, len) {
    /* append padding */
    x[len >> 5] |= 0x80 << (len % 32)
    x[((len + 64) >>> 9 << 4) + 14] = len

    var i
    var olda
    var oldb
    var oldc
    var oldd
    var a = 1732584193
    var b = -271733879
    var c = -1732584194
    var d = 271733878

    for (i = 0; i < x.length; i += 16) {
      olda = a
      oldb = b
      oldc = c
      oldd = d

      a = md5ff(a, b, c, d, x[i], 7, -680876936)
      d = md5ff(d, a, b, c, x[i + 1], 12, -389564586)
      c = md5ff(c, d, a, b, x[i + 2], 17, 606105819)
      b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330)
      a = md5ff(a, b, c, d, x[i + 4], 7, -176418897)
      d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426)
      c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341)
      b = md5ff(b, c, d, a, x[i + 7], 22, -45705983)
      a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416)
      d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417)
      c = md5ff(c, d, a, b, x[i + 10], 17, -42063)
      b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162)
      a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682)
      d = md5ff(d, a, b, c, x[i + 13], 12, -40341101)
      c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290)
      b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329)

      a = md5gg(a, b, c, d, x[i + 1], 5, -165796510)
      d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632)
      c = md5gg(c, d, a, b, x[i + 11], 14, 643717713)
      b = md5gg(b, c, d, a, x[i], 20, -373897302)
      a = md5gg(a, b, c, d, x[i + 5], 5, -701558691)
      d = md5gg(d, a, b, c, x[i + 10], 9, 38016083)
      c = md5gg(c, d, a, b, x[i + 15], 14, -660478335)
      b = md5gg(b, c, d, a, x[i + 4], 20, -405537848)
      a = md5gg(a, b, c, d, x[i + 9], 5, 568446438)
      d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690)
      c = md5gg(c, d, a, b, x[i + 3], 14, -187363961)
      b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501)
      a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467)
      d = md5gg(d, a, b, c, x[i + 2], 9, -51403784)
      c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473)
      b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734)

      a = md5hh(a, b, c, d, x[i + 5], 4, -378558)
      d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463)
      c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562)
      b = md5hh(b, c, d, a, x[i + 14], 23, -35309556)
      a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060)
      d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353)
      c = md5hh(c, d, a, b, x[i + 7], 16, -155497632)
      b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640)
      a = md5hh(a, b, c, d, x[i + 13], 4, 681279174)
      d = md5hh(d, a, b, c, x[i], 11, -358537222)
      c = md5hh(c, d, a, b, x[i + 3], 16, -722521979)
      b = md5hh(b, c, d, a, x[i + 6], 23, 76029189)
      a = md5hh(a, b, c, d, x[i + 9], 4, -640364487)
      d = md5hh(d, a, b, c, x[i + 12], 11, -421815835)
      c = md5hh(c, d, a, b, x[i + 15], 16, 530742520)
      b = md5hh(b, c, d, a, x[i + 2], 23, -995338651)

      a = md5ii(a, b, c, d, x[i], 6, -198630844)
      d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415)
      c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905)
      b = md5ii(b, c, d, a, x[i + 5], 21, -57434055)
      a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571)
      d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606)
      c = md5ii(c, d, a, b, x[i + 10], 15, -1051523)
      b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799)
      a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359)
      d = md5ii(d, a, b, c, x[i + 15], 10, -30611744)
      c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380)
      b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649)
      a = md5ii(a, b, c, d, x[i + 4], 6, -145523070)
      d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379)
      c = md5ii(c, d, a, b, x[i + 2], 15, 718787259)
      b = md5ii(b, c, d, a, x[i + 9], 21, -343485551)

      a = safeAdd(a, olda)
      b = safeAdd(b, oldb)
      c = safeAdd(c, oldc)
      d = safeAdd(d, oldd)
    }
    return [a, b, c, d]
  }

  /*
  * Convert an array of little-endian words to a string
  */
  function binl2rstr (input) {
    var i
    var output = ''
    var length32 = input.length * 32
    for (i = 0; i < length32; i += 8) {
      output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xff)
    }
    return output
  }

  /*
  * Convert a raw string to an array of little-endian words
  * Characters >255 have their high-byte silently ignored.
  */
  function rstr2binl (input) {
    var i
    var output = []
    output[(input.length >> 2) - 1] = undefined
    for (i = 0; i < output.length; i += 1) {
      output[i] = 0
    }
    var length8 = input.length * 8
    for (i = 0; i < length8; i += 8) {
      output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << (i % 32)
    }
    return output
  }

  /*
  * Calculate the MD5 of a raw string
  */
  function rstrMD5 (s) {
    return binl2rstr(binlMD5(rstr2binl(s), s.length * 8))
  }

  /*
  * Calculate the HMAC-MD5, of a key and some data (raw strings)
  */
  function rstrHMACMD5 (key, data) {
    var i
    var bkey = rstr2binl(key)
    var ipad = []
    var opad = []
    var hash
    ipad[15] = opad[15] = undefined
    if (bkey.length > 16) {
      bkey = binlMD5(bkey, key.length * 8)
    }
    for (i = 0; i < 16; i += 1) {
      ipad[i] = bkey[i] ^ 0x36363636
      opad[i] = bkey[i] ^ 0x5c5c5c5c
    }
    hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8)
    return binl2rstr(binlMD5(opad.concat(hash), 512 + 128))
  }

  /*
  * Convert a raw string to a hex string
  */
  function rstr2hex (input) {
    var hexTab = '0123456789abcdef'
    var output = ''
    var x
    var i
    for (i = 0; i < input.length; i += 1) {
      x = input.charCodeAt(i)
      output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f)
    }
    return output
  }

  /*
  * Encode a string as utf-8
  */
  function str2rstrUTF8 (input) {
    return unescape(encodeURIComponent(input))
  }

  /*
  * Take string arguments and return either raw or hex encoded strings
  */
  function rawMD5 (s) {
    return rstrMD5(str2rstrUTF8(s))
  }
  function hexMD5 (s) {
    return rstr2hex(rawMD5(s))
  }
  function rawHMACMD5 (k, d) {
    return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d))
  }
  function hexHMACMD5 (k, d) {
    return rstr2hex(rawHMACMD5(k, d))
  }

  function md5 (string, key, raw) {
    if (!key) {
      if (!raw) {
        return hexMD5(string)
      }
      return rawMD5(string)
    }
    if (!raw) {
      return hexHMACMD5(key, string)
    }
    return rawHMACMD5(key, string)
  }

  if (typeof define === 'function' && define.amd) {
    define(function () {
      return md5
    })
  } else if (typeof module === 'object' && module.exports) {
    module.exports = md5
  } else {
    $.md5 = md5
  }
})(this)

附送app 端 拨打电话
小程序拨打电话就不多说了

app端 官方介绍: http://www.html5plus.org/doc/zh_cn/device.html#plus.device.dial

直接真机调试,模拟器会失败

plus.device.dial(phone); // phone 为要拨打的号码

在这里插入图片描述

uni-app 真机调试(选择自定义基座)

(标准基座)开发者设置的第三方SDK配置信息不会生效。

(标准基座)安装到手机上app名字是“HBuilder”。支付不会生效

(自定义基座)包名会变成你项目的名字,这时支付,分享等多会生效
在这里插入图片描述
到此结束了,感谢阅读。留下个宝贵的关注吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/109781.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mysql5.7主从复制配置

写在最前面&#xff1a;一入编程深似海&#xff0c;从此对象变路人&#xff08;码农没时间谈恋爱&#xff09;。很长一段时间连写个文章的时间都没有了&#xff0c;学完后端、学前端&#xff0c;前端刚入门又要搞容器化&#xff0c;这真是“一重山外一重关&#xff0c;关关难过…

如何在Angular框架中更好地使用字体?一篇文章解答!

作为前端开发人员&#xff0c;在Angular JS中构建项目时&#xff0c;使用自定义字体可能会很棘手。有时候&#xff0c;如果开发者想要把选择的字体添加到项目中&#xff0c;将不得不把它导入到现有的代码中。 PS&#xff1a;Kendo UI致力于新的开发&#xff0c;来满足不断变化…

信息安全产品认证

文章目录一、引言二、《网络关键设备和网络安全专用产品安全认证证书》2.1 背景2.2 产品目录2.3 认证依据标准2.4 认证机构三、《中国国家信息安全产品认证证书》3.1 背景3.2 产品目录3.3 行业跟进四、《IT产品信息安全认证证书》五、CCC认证5.1背景5.2 中国强制性产品认证体系…

多源传感器组合导航 GNSS 视觉SLAM LiDAR INS 开源项目总结

多源传感器组合导航 GNSS 视觉SLAM LiDAR INS 开源项目总结 本文更改自 吴桐wutong 微信公众号文章。 开源代码总览 名称传感器类型组合类型滤波方法备注RTKLIBG-KFGAMP、rtklibexplorerhttps://www.rtklib.com/GPSTKG-KFhttps://github.com/SGL-UT/GPSTkBNCG-KFppp_wizardK…

【多个IP地址用逗号分割开】vue简单实现,textarea文本域输入多个ip地址用逗号分隔开,根据空格分割

前言 这个功能也是很多地方会用到的。 一般使用的地方是比如需要设置白名单或者黑名单 然后页面上会有一个textarea文本域。 在文本域中输入多个ip地址&#xff0c;输入一个回车换一行。 然后点击保存后&#xff0c;把数据通过逗号隔开的格式传给后端 后端再去拿到每一个ip地址…

电脑重装系统win11如何更改默认下载路径

win11如何更改默认下载路径&#xff1f;当大家平日里面&#xff0c;在使用win11系统的时候&#xff0c;如果觉得某一个下载路径的内存空间已经满了的话&#xff0c;那么就必须要及时更改&#xff0c;下面是小编提 供的更改路径的方法。 工具/原料&#xff1a; 系统版本&#x…

ES集群节点角色更换

背景 如何在一个3节点集群中&#xff0c;将Master/Data角色的节点中的数据分散到其他数据节点中&#xff0c;将该节点角色变更为Master 操作步骤 构建集群 集群角色如下 m-01:master/data d-02:data d-03:data 集群配置文件&#xff1a; Master节点elasticsearch.yml配置文件…

关于Maven中引用的jar的version配置为版本区间自动使用最新的版本,maven是如何判断哪个版本更加新?

背景 在Maven中&#xff0c;a工程引入了个jar包&#xff08;b工程&#xff09;&#xff0c;可以使用区间引入的方式&#xff0c;类似于数学区间的写法&#xff0c;如下 <dependency><groupId>org.example</groupId><artifactId>demo-jar</artifac…

使用Anaconda安装TensorFlow详细教程

一、Anaconda安装 可以参考笔者的这篇博客&#xff1a;Anaconda安装详细教程 二、准备工作 1、单击启动Anaconda Prompt创建新虚拟环境 2、在Anaconda Prompt依次执行以下命令conda create -n pytorch python3.6&#xff0c;创建名字为tensorflow的虚拟环境&#xff0c;再通…

Nacos学习笔记 (2)配置管理

1. 什么是配置中心 1.1 什么是配置 应用程序在启动和运行的时候往往需要读取一些配置信息&#xff0c;配置基本上伴随着应用程序的整个生命周期&#xff0c;比如&#xff1a;数据库连接参数、启动参数等。 配置主要有以下几个特点&#xff1a; &#xff08;1&#xff09;配…

LeetCode刷题复盘笔记—一文搞懂动态规划之674. 最长连续递增序列问题(动态规划系列第三十篇)

今日主要总结一下动态规划的一道题目&#xff0c;674. 最长连续递增序列 题目&#xff1a;674. 最长连续递增序列 Leetcode题目地址 题目描述&#xff1a; 给定一个未经排序的整数数组&#xff0c;找到最长且 连续递增的子序列&#xff0c;并返回该序列的长度。 连续递增的子…

怎么给视频加水印?

怎么给视频加水印&#xff1f;不管你是在网上下载的视频还是直接在网上观看视频&#xff0c;都能发现这些视频上往往都会有水印&#xff0c;有的水印可能是logo&#xff0c;有的水印可能是文字&#xff0c;这些水印不仅可以防止视频被别人盗取&#xff0c;还能很好的给自己做宣…

【JavaScript】js的websocket封装调用

WebSocket 是 HTML5 开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。 WebSocket 通信协议于 2011 年被 IETF 定为标准 RFC 6455&#xff0c;WebSocketAPI 被 W3C 定为标准。 在 WebSocket API 中&#xff0c;浏览器和服务器只需要要做一个握手的动作&#xff0c;然…

4.triton c++使用

4.1 tritonclient c使用 4.2 triton c使用 4.3依赖安装 1.安装minconda Minconda是一个Anaconda的轻量级替代&#xff0c;默认只安装了python和conda&#xff0c;但可以通过pip和conda来安装所需要的包 1)下载 官网下载符合自己系统的版本Miniconda — conda documentation …

SpringBoot:模块探究之spring-boot-devtools

Spring Boot 使我们能够快速设置和运行服务。为了进一步增强开发体验&#xff0c;Spring 发布了 spring-boot-devtools 工具——作为 Spring Boot-1.3 的一部分 spring-boot-devtools 是 Spring Boot 提供的一组开发工具&#xff0c;可以提高开发者的工作效率&#xff0c;开发者…

软件设计中最关键的“开闭原则”,究竟指什么呢?

前言 软件设计原则中有一条很关键的原则是开闭原则&#xff0c;就是所谓的对扩展开放&#xff0c;对修改关闭。个人觉得这条原则是非常重要的&#xff0c;直接关系到你的设计是否具备良好的扩展性&#xff0c;但也是相对比较难以理解和掌握的&#xff0c;究竟怎样的代码改动才…

js实现匹配到文字设置为红色

html <div class"search-text"> <el-input placeholder"请输入关键字" v-model"searchInput" class"searchinput"> <el-button type"primary" slot"append" icon"el-icon-search" clic…

软考网络工程师怎么学习,用那些书籍?

网工考试内容考试内容范围十分广&#xff0c;涉及到学科众多&#xff0c;既要考察基础理论&#xff0c;又要考察实践应用经验。如果你学习效率不高又追求效率的话最好报个培训班&#xff0c;有那么长的时间摸索不如几千块报个班。 比如计算机系统基础、网络操作系统、计算机应…

Blazor组件自做十四 : Blazor FileViewer 文件预览 组件

Blazor FileViewer 文件预览 组件 目前支支持 Excel(.docx) 和 Word(.xlsx) 格式 示例: https://www.blazor.zone/fileViewers https://blazor.app1.es/fileViewers 使用方法: 1.nuget包 BootstrapBlazor.FileViewer 2._Imports.razor 文件 或者页面添加 添加组件库引用…

U-net

文章目录1、U-net 简介2、U-net网络详解2.1、U-net结构图2.2、U-net主要创新2.3、U-net网络优势3、目前常用方法U-net改动4、U-net网络程序代码1、U-net 简介 U-net 发表于 2015 年&#xff0c;属于 FCN 的一种变体 。Unet 的初衷是为了解决生物医学图像方面的问题&#xff0c…