From be5829165f7cd49216971d22e39b8eae16fad915 Mon Sep 17 00:00:00 2001
From: tj <1378534974@qq.com>
Date: 星期二, 25 三月 2025 14:06:19 +0800
Subject: [PATCH] 1.阿里支付
---
app/src/main/res/values-v23/themes.xml | 9 ++
app/src/main/res/values/styles.xml | 9 ++
app/src/main/res/drawable/ic_back.xml | 10 +
app/src/main/res/values/strings.xml | 44 ++++++++++
app/src/main/res/values/themes.xml | 5 +
app/src/main/res/xml/network_security_config.xml | 2
app/src/main/java/com/example/firstapp/pay/PayResult.kt | 7 +
app/src/main/java/com/example/firstapp/pay/AliPayHelper.kt | 35 ++++++++
app/src/main/java/com/example/firstapp/database/response/AlipayOrderInfoResponse.kt | 7 +
app/src/main/java/com/example/firstapp/pay/PayAbility.kt | 16 ++++
app/src/main/res/values-night/themes.xml | 5 +
app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt | 45 ++++++++++
app/build.gradle | 7 +
13 files changed, 193 insertions(+), 8 deletions(-)
diff --git a/app/build.gradle b/app/build.gradle
index 6ae6903..3257afb 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -38,6 +38,7 @@
}
buildFeatures {
viewBinding true
+ dataBinding true
}
}
@@ -279,4 +280,10 @@
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
+ // 支付宝支付SDK
+ api 'com.alipay.sdk:alipaysdk-android:+@aar'
+
+ implementation 'com.google.android.material:material:1.4.0'
+
+
}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/database/response/AlipayOrderInfoResponse.kt b/app/src/main/java/com/example/firstapp/database/response/AlipayOrderInfoResponse.kt
new file mode 100644
index 0000000..0872566
--- /dev/null
+++ b/app/src/main/java/com/example/firstapp/database/response/AlipayOrderInfoResponse.kt
@@ -0,0 +1,7 @@
+package com.example.firstapp.database.response
+
+data class AlipayOrderInfoResponse(
+ val code: Int,
+ val msg: String,
+ val data: String
+)
diff --git a/app/src/main/java/com/example/firstapp/pay/AliPayHelper.kt b/app/src/main/java/com/example/firstapp/pay/AliPayHelper.kt
new file mode 100644
index 0000000..0e5bcc3
--- /dev/null
+++ b/app/src/main/java/com/example/firstapp/pay/AliPayHelper.kt
@@ -0,0 +1,35 @@
+package com.example.firstapp.pay
+
+import android.app.Activity
+import android.text.TextUtils
+import androidx.lifecycle.Observer
+import com.alipay.sdk.app.PayTask
+import com.example.firstapp.utils.Log
+
+object AliPayHelper {
+ fun pay(activity: Activity, orderInfo: String,observer:Observer<PayResult>) {
+
+ // 开启线程
+ Thread {
+ try {
+ var alipayTask = PayTask(activity)
+ var payV2 = alipayTask.payV2(orderInfo, true)
+ Log.d("AliPayHelper", "payV2: $payV2")
+ val payResult = PayResult(payV2)
+
+ var result = payV2.get("result") // 支付结果信息
+ var resultStatus = payV2.get("resultStatus") // 支付结果状态码
+ var memo = payV2.get("memo") // 错误信息提示
+
+ Log.d("AliPayHelper", "result: $result")
+ Log.d("AliPayHelper", "resultStatus: $resultStatus")
+ Log.d("AliPayHelper", "memo: $memo")
+
+ observer.onChanged(payResult)
+
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ }.start()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/pay/PayAbility.kt b/app/src/main/java/com/example/firstapp/pay/PayAbility.kt
new file mode 100644
index 0000000..5f2b35e
--- /dev/null
+++ b/app/src/main/java/com/example/firstapp/pay/PayAbility.kt
@@ -0,0 +1,16 @@
+package com.example.firstapp.pay
+
+import android.app.Activity
+import androidx.lifecycle.Observer
+
+object PayAbility {
+
+
+ /**
+ * 支付宝支付方法
+ */
+ fun aliPay(activity: Activity, orderInfo: String, observer: Observer<PayResult>) {
+ AliPayHelper.pay(activity, orderInfo, observer)
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/pay/PayResult.kt b/app/src/main/java/com/example/firstapp/pay/PayResult.kt
new file mode 100644
index 0000000..9f4d941
--- /dev/null
+++ b/app/src/main/java/com/example/firstapp/pay/PayResult.kt
@@ -0,0 +1,7 @@
+package com.example.firstapp.pay
+
+class PayResult constructor(payV2: Map<String,String>) {
+ val result = payV2.get("result") // 支付结果信息
+ val resultStatus = payV2.get("resultStatus") // 支付结果状态码
+ val memo = payV2.get("memo") // 错误信息提示
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt b/app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt
index ea75a47..ef69523 100644
--- a/app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt
+++ b/app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt
@@ -15,6 +15,7 @@
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
+import androidx.lifecycle.Observer
import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController
import com.google.android.material.dialog.MaterialAlertDialogBuilder
@@ -22,9 +23,12 @@
import com.example.firstapp.activity.ContentDetailActivity
import com.example.firstapp.database.service.RetrofitClient
import com.example.firstapp.databinding.FragmentNotificationsBinding
+import com.example.firstapp.pay.PayAbility
import com.example.firstapp.ui.reminderOther.ReminderOtherAddActivity2
import com.example.firstapp.ui.reminderOther.ReminderSettingsFragmentOther
import com.example.firstapp.ui.profile.EditProfileActivity
+import com.example.firstapp.utils.Log
+import com.google.android.material.snackbar.Snackbar
import kotlinx.coroutines.launch
import com.bumptech.glide.Glide
import com.example.firstapp.database.response.UserInfo
@@ -124,6 +128,41 @@
}
private fun setupClickListeners() {
+
+ // 支付插件
+ binding.payPlugin.setOnClickListener {
+ // 跳转到支付插件页面
+ lifecycleScope.launch {
+ try {
+ val response = RetrofitClient.apiService.getPayOrderInfo()
+ var orderInfo=response.data
+ Log.d("AliPayHelper","获取订单信息时: ${response}")
+ // 这里调用支付宝
+ PayAbility.aliPay(requireActivity(), orderInfo, Observer {
+ when (it.resultStatus) {
+ "9000" -> {
+// Snackbar.make(binding.root, "支付成功", Snackbar.LENGTH_LONG).show()
+ requireActivity().runOnUiThread {
+ Toast.makeText(requireContext(), "支付成功", Toast.LENGTH_LONG).show()
+ }
+ }
+ else -> {
+// Snackbar.make(binding.root, "支付失败", Snackbar.LENGTH_LONG).show()
+ requireActivity().runOnUiThread {
+ Toast.makeText(requireContext(), "支付失败", Toast.LENGTH_LONG).show()
+ }
+
+ }
+ }
+ })
+
+ } catch (e: Exception) {
+ Log.d("AliPayHelper","获取订单信息时发生错误: ${e.message}")
+ }
+ }
+ }
+
+
// 设置提醒
binding.layoutReminder.setOnClickListener {
findNavController().navigate(R.id.action_navigation_notifications_to_reminderSettingsFragment)
@@ -270,11 +309,11 @@
.load(userInfo.cover)
.placeholder(R.drawable.default_avatar)
.into(binding.ivAvatar)
-
+
// 设置昵称和账号
binding.tvNickname.text = userInfo.name
binding.tvUserId.text = "个人账号:${userInfo.contactTel}"
-
+
// 设置VIP信息
if (userInfo.showed) {
binding.ivVip.visibility = View.VISIBLE
@@ -295,7 +334,7 @@
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
-
+
// 加载用户信息
lifecycleScope.launch {
loadUserInfo()
diff --git a/app/src/main/res/drawable/ic_back.xml b/app/src/main/res/drawable/ic_back.xml
index b0ce776..af91489 100644
--- a/app/src/main/res/drawable/ic_back.xml
+++ b/app/src/main/res/drawable/ic_back.xml
@@ -1,9 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
+
<path
- android:fillColor="#000000"
- android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/>
-</vector>
\ No newline at end of file
+ android:strokeColor="#FFFFFF"
+ android:strokeWidth="2"
+ android:fillColor="@android:color/transparent"
+ android:pathData="M15,19l-7-7 7-7" />
+</vector>
diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml
index 39e726f..4925b55 100644
--- a/app/src/main/res/values-night/themes.xml
+++ b/app/src/main/res/values-night/themes.xml
@@ -21,4 +21,9 @@
<item name="fullscreenBackgroundColor">@color/light_blue_900</item>
<item name="fullscreenTextColor">@color/light_blue_A400</item>
</style>
+ <!-- Base application theme. -->
+ <style name="Base.Theme.FirstApp" parent="Theme.Material3.DayNight.NoActionBar">
+ <!-- Customize your dark theme here. -->
+ <!-- <item name="colorPrimary">@color/my_dark_primary</item> -->
+ </style>
</resources>
\ No newline at end of file
diff --git a/app/src/main/res/values-v23/themes.xml b/app/src/main/res/values-v23/themes.xml
new file mode 100644
index 0000000..b806642
--- /dev/null
+++ b/app/src/main/res/values-v23/themes.xml
@@ -0,0 +1,9 @@
+<resources xmlns:tools="http://schemas.android.com/tools">
+
+ <style name="Theme.FirstApp" parent="Base.Theme.FirstApp">
+ <!-- Transparent system bars for edge-to-edge. -->
+ <item name="android:navigationBarColor">@android:color/transparent</item>
+ <item name="android:statusBarColor">@android:color/transparent</item>
+ <item name="android:windowLightStatusBar">?attr/isLightTheme</item>
+ </style>
+</resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index feb8be6..f507e55 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -12,7 +12,6 @@
<string name="title_activity_reminder_other_add2">添加纪念日</string>
-
<string-array name="day_types">
<item>纪念日</item>
<item>生日</item>
@@ -48,8 +47,49 @@
<item>月</item>
<item>年</item>
</string-array>
+ <string name="title_activity_member">MemberActivity</string>
+ <!-- Strings used for fragments for navigation -->
+ <string name="first_fragment_label">First Fragment</string>
+ <string name="second_fragment_label">Second Fragment</string>
+ <string name="next">Next</string>
+ <string name="previous">Previous</string>
-
+ <string name="lorem_ipsum">
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam in scelerisque sem. Mauris
+ volutpat, dolor id interdum ullamcorper, risus dolor egestas lectus, sit amet mattis purus
+ dui nec risus. Maecenas non sodales nisi, vel dictum dolor. Class aptent taciti sociosqu ad
+ litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse blandit eleifend
+ diam, vel rutrum tellus vulputate quis. Aliquam eget libero aliquet, imperdiet nisl a,
+ ornare ex. Sed rhoncus est ut libero porta lobortis. Fusce in dictum tellus.\n\n
+ Suspendisse interdum ornare ante. Aliquam nec cursus lorem. Morbi id magna felis. Vivamus
+ egestas, est a condimentum egestas, turpis nisl iaculis ipsum, in dictum tellus dolor sed
+ neque. Morbi tellus erat, dapibus ut sem a, iaculis tincidunt dui. Interdum et malesuada
+ fames ac ante ipsum primis in faucibus. Curabitur et eros porttitor, ultricies urna vitae,
+ molestie nibh. Phasellus at commodo eros, non aliquet metus. Sed maximus nisl nec dolor
+ bibendum, vel congue leo egestas.\n\n
+ Sed interdum tortor nibh, in sagittis risus mollis quis. Curabitur mi odio, condimentum sit
+ amet auctor at, mollis non turpis. Nullam pretium libero vestibulum, finibus orci vel,
+ molestie quam. Fusce blandit tincidunt nulla, quis sollicitudin libero facilisis et. Integer
+ interdum nunc ligula, et fermentum metus hendrerit id. Vestibulum lectus felis, dictum at
+ lacinia sit amet, tristique id quam. Cras eu consequat dui. Suspendisse sodales nunc ligula,
+ in lobortis sem porta sed. Integer id ultrices magna, in luctus elit. Sed a pellentesque
+ est.\n\n
+ Aenean nunc velit, lacinia sed dolor sed, ultrices viverra nulla. Etiam a venenatis nibh.
+ Morbi laoreet, tortor sed facilisis varius, nibh orci rhoncus nulla, id elementum leo dui
+ non lorem. Nam mollis ipsum quis auctor varius. Quisque elementum eu libero sed commodo. In
+ eros nisl, imperdiet vel imperdiet et, scelerisque a mauris. Pellentesque varius ex nunc,
+ quis imperdiet eros placerat ac. Duis finibus orci et est auctor tincidunt. Sed non viverra
+ ipsum. Nunc quis augue egestas, cursus lorem at, molestie sem. Morbi a consectetur ipsum, a
+ placerat diam. Etiam vulputate dignissim convallis. Integer faucibus mauris sit amet finibus
+ convallis.\n\n
+ Phasellus in aliquet mi. Pellentesque habitant morbi tristique senectus et netus et
+ malesuada fames ac turpis egestas. In volutpat arcu ut felis sagittis, in finibus massa
+ gravida. Pellentesque id tellus orci. Integer dictum, lorem sed efficitur ullamcorper,
+ libero justo consectetur ipsum, in mollis nisl ex sed nisl. Donec maximus ullamcorper
+ sodales. Praesent bibendum rhoncus tellus nec feugiat. In a ornare nulla. Donec rhoncus
+ libero vel nunc consequat, quis tincidunt nisl eleifend. Cras bibendum enim a justo luctus
+ vestibulum. Fusce dictum libero quis erat maximus, vitae volutpat diam dignissim.
+ </string>
</resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index b325d99..2d7a78f 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -9,6 +9,15 @@
<item name="android:focusable">true</item>
</style>
+ <style name="PluginPay">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:padding">16dp</item>
+ <item name="android:background">?android:attr/selectableItemBackground</item>
+ <item name="android:clickable">true</item>
+ <item name="android:focusable">true</item>
+ </style>
+
<style name="Widget.Theme.FirstApp.ActionBar.Fullscreen" parent="Widget.AppCompat.ActionBar">
<item name="android:background">@color/black_overlay</item>
</style>
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
index b8ebbff..02c10a9 100644
--- a/app/src/main/res/values/themes.xml
+++ b/app/src/main/res/values/themes.xml
@@ -34,4 +34,9 @@
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
+ <!-- Base application theme. -->
+ <style name="Base.Theme.FirstApp" parent="Theme.Material3.DayNight.NoActionBar">
+ <!-- Customize your light theme here. -->
+ <!-- <item name="colorPrimary">@color/my_light_primary</item> -->
+ </style>
</resources>
\ No newline at end of file
diff --git a/app/src/main/res/xml/network_security_config.xml b/app/src/main/res/xml/network_security_config.xml
index f0f1944..d1689af 100644
--- a/app/src/main/res/xml/network_security_config.xml
+++ b/app/src/main/res/xml/network_security_config.xml
@@ -3,6 +3,8 @@
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">47.96.225.205</domain>
<domain includeSubdomains="true">192.168.1.213</domain>
+ <domain includeSubdomains="true">192.168.1.198</domain>
+ <domain includeSubdomains="true">192.168.1.199</domain>
<!-- 可添加其他域名或IP(如192.168.0.101) -->
<!-- 如果本地服务使用自签名证书,需在 network_security_config.xml 中信任该证书:-->
<!-- <trust-anchors>-->
--
Gitblit v1.9.3