android kotlin webview内H5调用微信支付问题

问题

在这里插入图片描述

商家参数格式有误,请联系商家解决

微信文档描述

https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4

在这里插入图片描述

解决方法

文档说明白了,要在请求头上加上Refrence,
注意并不是在加载webview时加上请求头,
在这里插入图片描述

而是在调用微信支付的时候加上这个请求头

   override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
            return try {
                if (url!!.startsWith("http:") || url.startsWith("https:")) {
                    val wvHead: MutableMap<String, String> = HashMap()
                    wvHead["Referer"] = Referer
                    view!!.loadUrl(url, wvHead)
                } else {
                    val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
                    startActivity(intent)
                }
                true
            } catch (e: Exception) {
                false
            }
        }

完整程序

package com.wuzhao.ktt.wvtaste

import android.annotation.SuppressLint
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.util.Log
import android.view.KeyEvent
import android.webkit.WebView
import android.webkit.WebViewClient
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import com.wuzhao.ktt.R
import kotlin.system.exitProcess


class WebViewTaste : AppCompatActivity() {
    private lateinit var wv: WebView

    companion object {
        // 定义WebView首页地址[伴生对象]
        const val WEB_URL = "你的webview url"
        const val Referer = "申请的地址"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_web_view_taste)
        initWv()
    }

    @SuppressLint("SetJavaScriptEnabled")
    fun initWv() {
        wv = findViewById<WebView>(R.id.wv)
        wv.settings.javaScriptEnabled = true
        wv.webViewClient = webClient
        wv.loadUrl(WEB_URL)
    }

    private val webClient = object : WebViewClient() {
        override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
            return try {
                if (url!!.startsWith("http:") || url.startsWith("https:")) {
                    val wvHead: MutableMap<String, String> = HashMap()
                    wvHead["Referer"] = Referer
                    view!!.loadUrl(url, wvHead)
                } else {
                    val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
                    startActivity(intent)
                }
                true
            } catch (e: Exception) {
                false
            }
        }
    }

    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
        return if ((keyCode == KeyEvent.KEYCODE_BACK)) {
            if (wv.canGoBack()) {
                wv.goBack()//返回上一页面
                true
            } else {
                AlertDialog.Builder(this@WebViewTaste)
                    .setTitle("退出") //设置对话框标题
                    .setMessage("确定要退出?") //设置显示的内容
                    .setPositiveButton(
                        "确定"
                    ) { _, _ ->
                        exitProcess(0)//退出程序
                    }.setNegativeButton(
                        "取消"
                    ) { _, _ ->
                    }.show()
                false
            }
        } else {
            super.onKeyDown(keyCode, event)
        }
    }

}

搬家语雀了

csdn编辑器太难用了

原文语雀
https://www.yuque.com/wuzhao/kb/xa0a89

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
接入微信支付需要以下几个步骤: 1. 在项目中引入微信支付的SDK,可以通过Gradle引入。 2. 在AndroidManifest.xml中添加以下权限: ``` <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> ``` 3. 在AndroidManifest.xml中添加以下Activity: ``` <activity android:name=".wxapi.WXPayEntryActivity" android:exported="true" android:launchMode="singleTop"/> ``` 4. 在项目的build.gradle文件中添加以下依赖: ``` implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:<版本号>' ``` 5. 在你的代码中调用以下方法发起微信支付: ``` val req = PayReq() req.appId = "wxAPP_ID" // 应用ID req.partnerId = "商户号" // 商户号 req.prepayId = "预支付交易会话ID" // 预支付交易会话ID req.packageValue = "Sign=WXPay" // 扩展字段 req.nonceStr = "随机字符串" // 随机字符串,不长于32位 req.timeStamp = "时间戳" // 时间戳 req.sign = "签名" // 签名 api.sendReq(req) // 发起支付请求 ``` 其中,`api` 是 `IWXAPI` 接口的实例,可以通过以下代码获取: ``` val api = WXAPIFactory.createWXAPI(context, "wxAPP_ID", true) api.registerApp("wxAPP_ID") ``` 注意,需要将 `wxAPP_ID` 替换为你的应用ID。 下面是一个示例代码,使用 Kotlin 编写了一个简单的微信支付流程: ```kotlin import android.content.Context import com.tencent.mm.opensdk.modelpay.PayReq import com.tencent.mm.opensdk.openapi.IWXAPI import com.tencent.mm.opensdk.openapi.WXAPIFactory class WXPayHelper(private val context: Context) { private val api: IWXAPI init { api = WXAPIFactory.createWXAPI(context, "wxAPP_ID", true) api.registerApp("wxAPP_ID") } fun pay(order: WXPayOrder) { if (!api.isWXAppInstalled) { // 微信未安装 return } val req = PayReq() req.appId = order.appId req.partnerId = order.partnerId req.prepayId = order.prepayId req.packageValue = "Sign=WXPay" req.nonceStr = order.nonceStr req.timeStamp = order.timeStamp req.sign = order.sign api.sendReq(req) } } data class WXPayOrder( val appId: String, val partnerId: String, val prepayId: String, val nonceStr: String, val timeStamp: String, val sign: String ) ``` 在调用 `WXPayHelper.pay()` 方法时,传入一个 `WXPayOrder` 对象,即可发起微信支付请求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值