2024-03-01 16:54:46 +08:00
|
|
|
|
//
|
|
|
|
|
// UserPayViewController.swift
|
|
|
|
|
// yinmeng-ios
|
|
|
|
|
//
|
2024-03-04 14:14:33 +08:00
|
|
|
|
// Created by yinmeng on 2024/2/29.
|
2024-03-01 16:54:46 +08:00
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
import UIKit
|
2024-03-01 21:03:59 +08:00
|
|
|
|
import MBProgressHUD
|
2024-03-01 16:54:46 +08:00
|
|
|
|
|
|
|
|
|
class UserPayViewController: BaseViewController, HiddenNavigationBarProtocol{
|
2024-03-01 21:03:59 +08:00
|
|
|
|
var chooseModel:UserPayViewModel?
|
|
|
|
|
var orderId = ""
|
2024-03-01 16:54:46 +08:00
|
|
|
|
override func viewDidLoad() {
|
|
|
|
|
super.viewDidLoad()
|
2024-03-01 21:03:59 +08:00
|
|
|
|
|
|
|
|
|
setUILayout()
|
|
|
|
|
requestData()
|
|
|
|
|
NotificationCenter.default.addObserver(self, selector: #selector(receiveInitiatePaymentNot(not:)), name: NSNotification.Name(rawValue: "kInitiatePayment"), object: nil)
|
|
|
|
|
}
|
2024-03-04 14:14:33 +08:00
|
|
|
|
@objc func receiveInitiatePaymentNot(not:Notification) {
|
|
|
|
|
//
|
|
|
|
|
//
|
|
|
|
|
//
|
2024-03-01 21:03:59 +08:00
|
|
|
|
}
|
|
|
|
|
func requestData(){
|
|
|
|
|
RequestGet(path: "chargeprod/list", parma: ["channelType":"8"]) { data in
|
|
|
|
|
|
|
|
|
|
if let list = Deserialized<UserPayViewModel>.toArray(with: data) {
|
|
|
|
|
for (i,view) in self.viewList.enumerated() {
|
|
|
|
|
if i < list.count{
|
|
|
|
|
|
|
|
|
|
view.model = list[i]
|
|
|
|
|
self.chooseModel = list[0]
|
|
|
|
|
view.isHidden = false
|
|
|
|
|
}else{
|
|
|
|
|
view.isHidden = true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} fail: { code, data in
|
|
|
|
|
print(code)
|
|
|
|
|
}
|
|
|
|
|
RequestGet(path: "purse/query", parma: ["channelType":"8"]) { data in
|
|
|
|
|
|
|
|
|
|
if let model = Deserialized<UserPayViewModel>.toModel(with: data) {
|
|
|
|
|
self.pricView.text = model.diamonds
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} fail: { code, data in
|
|
|
|
|
print(code)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
@objc func clickPriceItemAction(tap:UITapGestureRecognizer){
|
|
|
|
|
for view in viewList {
|
|
|
|
|
if tap.view == view{
|
|
|
|
|
view.layer.borderWidth = 2
|
|
|
|
|
self.chooseModel = view.model
|
|
|
|
|
}else{
|
|
|
|
|
view.layer.borderWidth = 0
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@objc func lookUpTap(){
|
|
|
|
|
let web = WebViewController(url: "/\(H5Utils.pay.rawValue)")
|
|
|
|
|
self.navigationController?.pushViewController(web, animated: true)
|
|
|
|
|
}
|
|
|
|
|
func setUILayout(){
|
|
|
|
|
view.addSubview(backgroundView)
|
|
|
|
|
view.addSubview(scrollView)
|
|
|
|
|
|
|
|
|
|
view.addSubview(backBtn)
|
|
|
|
|
scrollView.addSubview(headBgView)
|
|
|
|
|
headBgView.addSubview(iconView)
|
|
|
|
|
headBgView.addSubview(textVeiw)
|
|
|
|
|
headBgView.addSubview(pricView)
|
|
|
|
|
scrollView.addSubview(itemVeiw1)
|
|
|
|
|
scrollView.addSubview(itemVeiw2)
|
|
|
|
|
scrollView.addSubview(itemVeiw3)
|
|
|
|
|
scrollView.addSubview(itemVeiw4)
|
|
|
|
|
scrollView.addSubview(payAgreement)
|
|
|
|
|
scrollView.addSubview(publishBtn)
|
|
|
|
|
viewList.append(itemVeiw1)
|
|
|
|
|
viewList.append(itemVeiw2)
|
|
|
|
|
viewList.append(itemVeiw3)
|
|
|
|
|
viewList.append(itemVeiw4)
|
|
|
|
|
|
|
|
|
|
for (i,view) in viewList.enumerated() {
|
|
|
|
|
view.tag = i + 100
|
|
|
|
|
let tap = UITapGestureRecognizer.init(target: self, action: #selector(clickPriceItemAction(tap:)))
|
|
|
|
|
view.addGestureRecognizer(tap)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let lookUpTap = UITapGestureRecognizer.init(target: self, action: #selector(lookUpTap))
|
|
|
|
|
payAgreement.addGestureRecognizer(lookUpTap)
|
|
|
|
|
scrollView.snp.makeConstraints { make in
|
|
|
|
|
make.edges.equalTo(self.view)
|
|
|
|
|
}
|
|
|
|
|
backgroundView.snp.makeConstraints { make in
|
|
|
|
|
make.edges.equalTo(self.view)
|
|
|
|
|
}
|
|
|
|
|
backBtn.snp.makeConstraints { make in
|
|
|
|
|
make.width.height.equalTo(30)
|
|
|
|
|
make.left.equalTo(16)
|
|
|
|
|
make.top.equalTo(StatusBarHeight + 12)
|
|
|
|
|
}
|
|
|
|
|
headBgView.snp.makeConstraints { make in
|
|
|
|
|
make.top.equalTo(self.backBtn.snp.bottom).offset(41)
|
|
|
|
|
make.width.equalTo(337)
|
|
|
|
|
make.centerX.equalTo(self.view)
|
|
|
|
|
make.height.equalTo(124)
|
|
|
|
|
}
|
|
|
|
|
iconView.snp.makeConstraints { make in
|
|
|
|
|
make.centerX.equalTo(self.headBgView).offset(-11)
|
|
|
|
|
make.width.height.equalTo(22)
|
|
|
|
|
make.top.equalTo(27)
|
|
|
|
|
}
|
|
|
|
|
textVeiw.snp.makeConstraints { make in
|
|
|
|
|
make.left.equalTo(self.iconView.snp.right).offset(6)
|
|
|
|
|
make.centerY.equalTo(self.iconView)
|
|
|
|
|
}
|
|
|
|
|
pricView.snp.makeConstraints { make in
|
|
|
|
|
make.top.equalTo(51)
|
|
|
|
|
make.centerX.equalTo(self.view)
|
|
|
|
|
}
|
|
|
|
|
itemVeiw1.snp.makeConstraints { make in
|
|
|
|
|
make.left.equalTo(self.headBgView.snp.left).offset(13)
|
|
|
|
|
make.width.equalTo(144)
|
|
|
|
|
make.height.equalTo(83)
|
|
|
|
|
make.top.equalTo(self.headBgView.snp.bottom).offset(19)
|
|
|
|
|
}
|
|
|
|
|
itemVeiw2.snp.makeConstraints { make in
|
|
|
|
|
make.left.equalTo(self.itemVeiw1.snp.right).offset(23)
|
|
|
|
|
make.width.equalTo(144)
|
|
|
|
|
make.height.equalTo(83)
|
|
|
|
|
make.top.equalTo(self.headBgView.snp.bottom).offset(19)
|
|
|
|
|
}
|
|
|
|
|
itemVeiw3.snp.makeConstraints { make in
|
|
|
|
|
make.left.equalTo(self.headBgView.snp.left).offset(13)
|
|
|
|
|
make.width.equalTo(144)
|
|
|
|
|
make.height.equalTo(83)
|
|
|
|
|
make.top.equalTo(self.itemVeiw1.snp.bottom).offset(20)
|
|
|
|
|
}
|
|
|
|
|
itemVeiw4.snp.makeConstraints { make in
|
|
|
|
|
make.left.equalTo(self.itemVeiw2)
|
|
|
|
|
make.width.equalTo(144)
|
|
|
|
|
make.height.equalTo(83)
|
|
|
|
|
make.top.equalTo(self.itemVeiw1.snp.bottom).offset(20)
|
|
|
|
|
}
|
|
|
|
|
payAgreement.snp.makeConstraints { make in
|
|
|
|
|
make.left.right.equalTo(self.view)
|
|
|
|
|
make.top.equalTo(self.itemVeiw4.snp.bottom).offset(40)
|
|
|
|
|
}
|
|
|
|
|
publishBtn.snp.makeConstraints { make in
|
|
|
|
|
make.width.equalTo(296)
|
|
|
|
|
make.height.equalTo(48)
|
|
|
|
|
make.centerX.equalTo(self.view)
|
|
|
|
|
make.top.equalTo(self.payAgreement.snp.bottom).offset(161)
|
|
|
|
|
}
|
|
|
|
|
publishBtn.superview?.layoutIfNeeded()
|
|
|
|
|
let y = publishBtn.y + publishBtn.frame.height
|
|
|
|
|
self.scrollView.contentSize = CGSize(width: ScreenWidth, height: y)
|
|
|
|
|
}
|
|
|
|
|
@objc func publishBtnAction(){
|
|
|
|
|
guard let chargeProdId = self.chooseModel?.chargeProdId else{
|
|
|
|
|
return
|
|
|
|
|
}
|
2024-03-04 14:14:33 +08:00
|
|
|
|
MBProgressHUD.showAdded(to: UIApplication.shared.keyWindow!, animated: true)
|
2024-03-01 21:03:59 +08:00
|
|
|
|
let uid = "\(AuthManager.userUid)"
|
|
|
|
|
let ticket = AuthManager.ticket
|
|
|
|
|
let deviceInfo = UIDevice.current.identifierForVendor?.uuidString ?? ""
|
|
|
|
|
let clientIp = "0.0.0.0"
|
|
|
|
|
RequestPost(path: "storeKitV2/placeOrder", parma: ["chargeProdId":chargeProdId,"uid":uid,"ticket":ticket,"deviceInfo":deviceInfo]) { data in
|
|
|
|
|
|
2024-03-04 14:14:33 +08:00
|
|
|
|
|
|
|
|
|
if let _data = data as? [String:Any],let recordId = _data["recordId"] as? String,let appAccountToken = _data["appAccountToken"] as? String{
|
|
|
|
|
self.initiatePaymentAction(recordId: recordId, appAccountToken: appAccountToken)
|
|
|
|
|
}else{
|
|
|
|
|
HUDTool.show(with: "购买失败")
|
|
|
|
|
MBProgressHUD.hide(for: UIApplication.shared.keyWindow!, animated: true)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2024-03-01 21:03:59 +08:00
|
|
|
|
} fail: { code, data in
|
2024-03-04 14:14:33 +08:00
|
|
|
|
HUDTool.show(with: data)
|
|
|
|
|
MBProgressHUD.hide(for: UIApplication.shared.keyWindow!, animated: true)
|
2024-03-01 21:03:59 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-03-01 16:54:46 +08:00
|
|
|
|
}
|
2024-03-01 21:03:59 +08:00
|
|
|
|
deinit{
|
|
|
|
|
NotificationCenter.default.removeObserver(self)
|
|
|
|
|
}
|
2024-03-04 14:14:33 +08:00
|
|
|
|
func initiatePaymentAction(recordId:String,appAccountToken:String) {
|
2024-03-01 21:03:59 +08:00
|
|
|
|
self.orderId = recordId
|
|
|
|
|
if #available(iOS 15.0, *) {
|
|
|
|
|
UserPayViewManager.shared._ConditionBlock = {[weak self] (state , result) in
|
|
|
|
|
if state == .Pay || state == .Start || state == .VerifiedServer{
|
|
|
|
|
|
|
|
|
|
}else if state == .Unowned{
|
|
|
|
|
HUDTool.show(with: "出现未知错误,请重新尝试")
|
2024-03-04 14:14:33 +08:00
|
|
|
|
MBProgressHUD.hide(for: UIApplication.shared.keyWindow!, animated: true)
|
2024-03-01 21:03:59 +08:00
|
|
|
|
}else{
|
|
|
|
|
HUDTool.show(with: "购买失败")
|
2024-03-04 14:14:33 +08:00
|
|
|
|
MBProgressHUD.hide(for: UIApplication.shared.keyWindow!, animated: true)
|
2024-03-01 21:03:59 +08:00
|
|
|
|
}
|
|
|
|
|
if state == .VerifiedServer{
|
2024-03-04 14:14:33 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if let data = result,let transactionId = data["transactionId"]{
|
|
|
|
|
self?.paySuccess(transactionId:"\(transactionId)")
|
|
|
|
|
}else{
|
|
|
|
|
HUDTool.show(with: "购买失败")
|
|
|
|
|
MBProgressHUD.hide(for: UIApplication.shared.keyWindow!, animated: true)
|
2024-03-01 21:03:59 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-03-04 14:14:33 +08:00
|
|
|
|
Task {
|
|
|
|
|
do {
|
|
|
|
|
try await UserPayViewManager.shared._demandCommodityThing(productId: self.chooseModel?.chargeProdId ?? "", uuid: appAccountToken)
|
|
|
|
|
|
|
|
|
|
}catch{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-03-01 21:03:59 +08:00
|
|
|
|
} else {
|
|
|
|
|
HUDTool.show(with: "充值失败。当前仅支持运行iOS15及以上系统的手机进行充值,请升级系统版本后重试。")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
func paySuccess(transactionId:String){
|
|
|
|
|
let uid = "\(AuthManager.userUid)"
|
|
|
|
|
let ticket = AuthManager.ticket
|
2024-03-04 14:14:33 +08:00
|
|
|
|
RequestPost(path: "storeKitV2/verifyOrder", parma: ["chargeRecordId":self.orderId,"chooseEnv":"true","uid":uid,"ticket":ticket,"transcationId":transactionId]) { data in
|
|
|
|
|
MBProgressHUD.hide(for: UIApplication.shared.keyWindow!, animated: true)
|
|
|
|
|
|
|
|
|
|
if #available(iOS 15.0, *) {
|
|
|
|
|
Task {
|
|
|
|
|
try await UserPayViewManager.shared._verifyBusinessAccomplish(transaction: transactionId)
|
|
|
|
|
self.orderId = ""
|
|
|
|
|
RequestGet(path: "purse/query", parma: ["channelType":"8"]) { data in
|
|
|
|
|
|
|
|
|
|
if let model = Deserialized<UserPayViewModel>.toModel(with: data) {
|
|
|
|
|
self.pricView.text = model.diamonds
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} fail: { code, data in
|
|
|
|
|
print(code)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} fail: { code, data in
|
|
|
|
|
if code == 1444{
|
|
|
|
|
Task {
|
|
|
|
|
if #available(iOS 15.0, *) {
|
|
|
|
|
try await UserPayViewManager.shared._verifyBusinessAccomplish(transaction: transactionId)
|
|
|
|
|
} else {
|
|
|
|
|
// Fallback on earlier versions
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
HUDTool.show(with: data)
|
|
|
|
|
MBProgressHUD.hide(for: UIApplication.shared.keyWindow!, animated: true)
|
|
|
|
|
}
|
2024-03-01 21:03:59 +08:00
|
|
|
|
}
|
|
|
|
|
@objc func backBtnAction(){
|
|
|
|
|
self.navigationController?.popViewController(animated: true)
|
|
|
|
|
}
|
|
|
|
|
var scrollView:UIScrollView = {
|
|
|
|
|
let _scrollView = UIScrollView()
|
|
|
|
|
_scrollView.backgroundColor = .clear
|
|
|
|
|
return _scrollView
|
|
|
|
|
}()
|
|
|
|
|
var backBtn:UIButton = {
|
|
|
|
|
let _backBtn = UIButton()
|
|
|
|
|
_backBtn.setImage(UIImage(named: "yin_user_pay_arrow"), for: .normal)
|
|
|
|
|
_backBtn.addTarget(self, action: #selector(backBtnAction), for: .touchUpInside)
|
|
|
|
|
return _backBtn
|
|
|
|
|
}()
|
|
|
|
|
private lazy var backgroundView:UIImageView = {
|
|
|
|
|
let _backgroundView = UIImageView()
|
|
|
|
|
_backgroundView.image = UIImage(named: "yin_user_pay_bg")
|
|
|
|
|
_backgroundView.isUserInteractionEnabled = true
|
|
|
|
|
return _backgroundView
|
|
|
|
|
}()
|
2024-03-01 16:54:46 +08:00
|
|
|
|
|
2024-03-01 21:03:59 +08:00
|
|
|
|
var headBgView:UIImageView = {
|
|
|
|
|
let _headBgView = UIImageView()
|
|
|
|
|
_headBgView.image = UIImage(named: "yin_user_pay_head_bg")
|
|
|
|
|
return _headBgView
|
|
|
|
|
}()
|
|
|
|
|
var iconView:UIImageView = {
|
|
|
|
|
let _iconView = UIImageView()
|
|
|
|
|
_iconView.image = UIImage(named: "yin_user_pay_icon")
|
|
|
|
|
|
|
|
|
|
return _iconView
|
|
|
|
|
}()
|
|
|
|
|
var textVeiw:UILabel = {
|
|
|
|
|
let _textVeiw = UILabel()
|
|
|
|
|
_textVeiw.text = "余额"
|
|
|
|
|
_textVeiw.font = UIFont.systemFont(ofSize: 18, weight: .regular)
|
|
|
|
|
_textVeiw.textColor = .white
|
|
|
|
|
return _textVeiw
|
|
|
|
|
}()
|
|
|
|
|
var pricView: UILabel = {
|
|
|
|
|
let _pricView = UILabel()
|
|
|
|
|
_pricView.text = "0"
|
|
|
|
|
_pricView.textColor = .white
|
|
|
|
|
_pricView.font = UIFont.systemFont(ofSize: 34, weight: .semibold)
|
|
|
|
|
return _pricView
|
|
|
|
|
}()
|
|
|
|
|
var viewList:[UserPayViewItemView] = []
|
|
|
|
|
var itemVeiw1:UserPayViewItemView = {
|
|
|
|
|
let _itemVeiw1 = UserPayViewItemView.init(frame:.zero)
|
|
|
|
|
_itemVeiw1.layer.borderWidth = 2
|
|
|
|
|
return _itemVeiw1
|
|
|
|
|
}()
|
|
|
|
|
var itemVeiw2:UserPayViewItemView = {
|
|
|
|
|
let _itemVeiw2 = UserPayViewItemView.init(frame:.zero)
|
|
|
|
|
|
|
|
|
|
return _itemVeiw2
|
|
|
|
|
}()
|
|
|
|
|
var itemVeiw3:UserPayViewItemView = {
|
|
|
|
|
let _itemVeiw3 = UserPayViewItemView.init(frame:.zero)
|
|
|
|
|
|
|
|
|
|
return _itemVeiw3
|
|
|
|
|
}()
|
|
|
|
|
var itemVeiw4:UserPayViewItemView = {
|
|
|
|
|
let _itemVeiw4 = UserPayViewItemView.init(frame:.zero)
|
|
|
|
|
|
|
|
|
|
return _itemVeiw4
|
|
|
|
|
}()
|
|
|
|
|
var payAgreement:UILabel = {
|
|
|
|
|
let _payAgreement = UILabel()
|
|
|
|
|
let text = "已阅读并同意《用户充值协议》\n如有任何问题请咨询客服"
|
|
|
|
|
let attText = NSMutableAttributedString.init(string: text, attributes: [.foregroundColor:ThemeColor(hexStr: "#FFFFFF",alpha: 0.8),.font:UIFont.systemFont(ofSize: 13, weight: .regular)])
|
|
|
|
|
attText.addAttributes([.foregroundColor:ThemeColor(hexStr: "#5DA4F5"),.font:UIFont.systemFont(ofSize: 13, weight: .regular)], range: NSRange(location: 6, length: 8))
|
|
|
|
|
_payAgreement.textAlignment = .center
|
|
|
|
|
_payAgreement.attributedText = attText
|
|
|
|
|
_payAgreement.numberOfLines = 2
|
|
|
|
|
_payAgreement.isUserInteractionEnabled = true
|
|
|
|
|
return _payAgreement
|
|
|
|
|
}()
|
2024-03-01 16:54:46 +08:00
|
|
|
|
|
2024-03-01 21:03:59 +08:00
|
|
|
|
|
|
|
|
|
var publishBtn:UIButton = {
|
|
|
|
|
let _publishBtn = UIButton()
|
|
|
|
|
|
|
|
|
|
_publishBtn.setBackgroundImage(UIImage(named: "yin_hoem_voice_record_publish_btn"), for: .normal)
|
|
|
|
|
_publishBtn.setTitle("立即充值", for: .normal)
|
|
|
|
|
_publishBtn.setTitleColor(.white, for: .normal)
|
|
|
|
|
_publishBtn.titleLabel?.font = UIFont.systemFont(ofSize: 16, weight: .semibold)
|
|
|
|
|
_publishBtn.addTarget(self, action: #selector(publishBtnAction), for: .touchUpInside)
|
|
|
|
|
return _publishBtn
|
|
|
|
|
}()
|
2024-03-01 16:54:46 +08:00
|
|
|
|
}
|