当前位置: 首页 > news >正文

教你做企业网站做一个企业网站设计

教你做企业网站,做一个企业网站设计,网站建设主要内容,网站模板下载网站有哪些Unity客户端接入原生Google支付 1. Google后台配置2. 开始接入Java部分C#部分Lua部分 3. 导出工程打包测试参考踩坑注意 1. Google后台配置 找到内部测试#xff08;这个测试轨道过审最快#xff09;#xff0c;打包上传#xff0c;这个包不需要接入支付#xff0c;如果已… Unity客户端接入原生Google支付 1. Google后台配置2. 开始接入Java部分C#部分Lua部分 3. 导出工程打包测试参考踩坑注意 1. Google后台配置 找到内部测试这个测试轨道过审最快打包上传这个包不需要接入支付如果已经有上传过包了那就跳过这一步 在许可测试里添加测试人员勾选测试人员列表并且设置许可相应为LICENSED这样才可以使用测试卡测试支付 确认已经添加了付款方式以及开放地区有香港否则可能需要挂VPN才能进行支付流程测试 流程图 2. 开始接入 确保Unity Plugins/Android里有com.android.billingclient.billing并且是v3版本以上这里用的5.0.0版本 Java部分 java文件也放到Plugins/Android下开头package需要根据项目而定 GoogleBillingManager.java package com.xxx.xxx;import android.app.Activity; import android.content.Context; import android.util.Log;import com.android.billingclient.api.BillingClient; import com.android.billingclient.api.BillingClientStateListener; import com.android.billingclient.api.BillingResult; import com.android.billingclient.api.Purchase; import com.android.billingclient.api.PurchasesUpdatedListener; import com.unity3d.player.UnityPlayer;import java.util.List;public class GoogleBillingManager {private static GoogleBillingManager instance;private static BillingClient billingClient;private static GoogleBillingListener billingListener;public static boolean isConnection false;private GoogleBillingManager() {instance this;createClient(UnityPlayer.currentActivity);}public static GoogleBillingManager getInstance() {if (instance null) {synchronized (GoogleBillingManager.class) {if (instance null) {instance new GoogleBillingManager();}}}return instance;}/*** 创建支付客户端*/public static void createClient(Activity activity) {if (isReady()) {return;}if (null activity) {Log.e(TAG,谷歌支付CreateClient, activity null);return;}billingClient BillingClient.newBuilder(activity).enablePendingPurchases().setListener(new PurchasesUpdatedListener() {Overridepublic void onPurchasesUpdated(BillingResult billingResult, ListPurchase purchases) {if (null ! billingListener) {billingListener.onPurchasesUpdated(billingResult, purchases);}}}).build();//启动支付连接startConn();}public BillingClient getBillingClient() {return billingClient;}/*** 添加监听事件*/public void setBillingListener(GoogleBillingListener listener) {billingListener listener;}/*** 是否准备好了** return*/public static boolean isReady() {return !(null billingClient || !billingClient.isReady());}/*** 启动连接*/private static void startConn() {if (isReady()) {return;}billingClient.startConnection(new BillingClientStateListener() {Overridepublic void onBillingSetupFinished(BillingResult billingResult) {if (billingResult.getResponseCode() BillingClient.BillingResponseCode.OK) {isConnection true;Log.e(TAG, 连接成功可以开始操作了~~~);}}Overridepublic void onBillingServiceDisconnected() {isConnection false;//连接失败。 可以尝试调用 startConnection 重新建立连接Log.e(TAG, 连接失败);}});}/*** 结束连接*/public void endConn() {if (null ! billingClient) {billingClient.endConnection();isConnection false;}} }GoogleBillHelper.java package com.xxx.xxx;import android.app.Activity; import android.util.Log;import com.android.billingclient.api.BillingClient; import com.android.billingclient.api.BillingFlowParams; import com.android.billingclient.api.BillingResult; import com.android.billingclient.api.ConsumeParams; import com.android.billingclient.api.ConsumeResponseListener; import com.android.billingclient.api.ProductDetails; import com.android.billingclient.api.Purchase; import com.android.billingclient.api.PurchasesResponseListener; import com.android.billingclient.api.QueryProductDetailsParams; import com.android.billingclient.api.QueryPurchasesParams; import com.unity3d.player.UnityPlayer;import java.util.ArrayList; import java.util.List;import io.reactivex.annotations.NonNull;/*** Desc:支付的具体操作* 1.查询* 2.购买* 3.消费*/ public class GoogleBillHelper {public static final String TAG GoogleBillHelper.class.getSimpleName();/*** 查询商品详情** param billingListener : 接口监听* param productIds :商品id 。对应Google 后台的* param productType :取值* BillingClient.ProductType.INAPP一次性商品* BillingClient.ProductType.SUBS订阅*/public static void onQuerySkuDetailsAsync(GoogleBillingListener billingListener, String productType, String productIds, String orderId) {if (null productIds){return;}String[] productList productIds.split(,);Log.e(TAG, onQuerySkuDetailsAsync: productIds ----- productList[0]);if (productList.length 0 || !GoogleBillingManager.getInstance().isReady()) {Log.e(TAG, productList.length: productList.length ,client: GoogleBillingManager.getInstance().isReady());return;}ListQueryProductDetailsParams.Product skuList new ArrayList();for (String productId : productList) {QueryProductDetailsParams.Product product QueryProductDetailsParams.Product.newBuilder().setProductId(productId).setProductType(productType).build();//添加对应的 产品id 去查询详情skuList.add(product);}QueryProductDetailsParams params QueryProductDetailsParams.newBuilder().setProductList(skuList).build();GoogleBillingManager.getInstance().getBillingClient().queryProductDetailsAsync(params, (billingResult, list) - {if (null ! billingListener) {billingListener.onProductDetailsSus(billingResult, list, orderId);}});}/*** 打开支付面板** param billingListener* param activity* param details*/public static void onOpenGooglePlay(GoogleBillingListener billingListener, Activity activity, ProductDetails details, String orderId) {if (null details) {return;}ListBillingFlowParams.ProductDetailsParams params new ArrayList();//添加购买数据BillingFlowParams.ProductDetailsParams productDetailsParams BillingFlowParams.ProductDetailsParams.newBuilder().setProductDetails(details).build();params.add(productDetailsParams);BillingFlowParams billingFlowParams BillingFlowParams.newBuilder().setProductDetailsParamsList(params).setObfuscatedAccountId(orderId).build();//添加购买监听GoogleBillingManager.getInstance().setBillingListener(billingListener);//响应code 码GoogleBillingManager.getInstance().getBillingClient().launchBillingFlow(activity, billingFlowParams).getResponseCode();}/*** 消费商品* 对于购买类型的商品需要手动调用一次消费方法 目的用户可以再次购买此商品** param billingListener* param purchase*/public static void onConsumeAsync(GoogleBillingListener billingListener, Purchase purchase) {if (!GoogleBillingManager.getInstance().isReady()) {return;}ConsumeParams consumeParams ConsumeParams.newBuilder().setPurchaseToken(purchase.getPurchaseToken()).build();ConsumeResponseListener listener (billingResult, purchaseToken) - {if (billingResult.getResponseCode() BillingClient.BillingResponseCode.OK) {String result 消费code : billingResult.getResponseCode() message : billingResult.getDebugMessage();if (null billingListener) {Log.e(TAG, result);}billingListener.onConsumeSus(billingResult.getResponseCode(), result, purchaseToken, purchase);}};GoogleBillingManager.getInstance().getBillingClient().consumeAsync(consumeParams, listener);}/*** 检查补单** param billingListener* param productType*/public static void queryPurchases(String productType, GoogleBillingListener billingListener){PurchasesResponseListener mPurchasesResponseListener new PurchasesResponseListener() {Overridepublic void onQueryPurchasesResponse(NonNull BillingResult billingResult, NonNull ListPurchase purchasesResult) {if(billingResult.getResponseCode() ! BillingClient.BillingResponseCode.OK || purchasesResult null){return;}for (Purchase purchase : purchasesResult) {if(purchase null || purchase.getPurchaseState() ! Purchase.PurchaseState.PURCHASED){continue;}billingListener.onQueryPurchases(purchase.getAccountIdentifiers().getObfuscatedAccountId());onConsumeAsync(billingListener, purchase); // 这里处理已经支付过的订单通知服务器去验证}}};QueryPurchasesParams params QueryPurchasesParams.newBuilder().setProductType(productType).build();GoogleBillingManager.getInstance().getBillingClient().queryPurchasesAsync(params, mPurchasesResponseListener);} }GoogleBillingListener.java package com.xxx.xxx;import android.util.Log;import com.android.billingclient.api.AccountIdentifiers; import com.android.billingclient.api.BillingClient; import com.android.billingclient.api.BillingResult; import com.android.billingclient.api.ProductDetails; import com.android.billingclient.api.Purchase; import com.android.billingclient.api.PurchasesUpdatedListener; import com.unity3d.player.UnityPlayer;import java.util.List;public class GoogleBillingListener implements PurchasesUpdatedListener {public final String objectName;public final String paySuccessMethodName;public final String detailsSusMethodName;public final String payFailMethodName;public final String payEndMethodName;public final String queryPurchasesMethodName;public final String detailsFailMethodName;public ProductDetails.OneTimePurchaseOfferDetails productDetails;public GoogleBillingListener(String objectName, String successMethodName, String processingMethodName,String failMethodName, String payEndMethodName, String queryPurchasesMethodName, String detailsFailMethodName) {this.objectName objectName;this.paySuccessMethodName successMethodName;this.detailsSusMethodName processingMethodName;this.payFailMethodName failMethodName;this.payEndMethodName payEndMethodName;this.queryPurchasesMethodName queryPurchasesMethodName;this.detailsFailMethodName detailsFailMethodName;}/*** 购买监听** param result* param purchases*/Overridepublic void onPurchasesUpdated(BillingResult result, ListPurchase purchases) {Log.e(TAG, result.toString());if (null purchases || purchases.size() 0) {Log.e(TAG, not purchases);UnityPlayer.UnitySendMessage(this.objectName, this.payEndMethodName, not purchases;BillingResult: result.toString());return;}for (Purchase purchase : purchases) {AccountIdentifiers accountIdentifiers purchase.getAccountIdentifiers();String resultStr accountIdentifiers.getObfuscatedAccountId() , purchase.getPurchaseToken() , purchase.getPurchaseState();UnityPlayer.UnitySendMessage(this.objectName, this.payEndMethodName, resultStr);if (purchase.getPurchaseState() Purchase.PurchaseState.PURCHASED){GoogleBillHelper.onConsumeAsync(this, purchase);}}}/*** 查询商品详情成功** param list*/public void onProductDetailsSus(BillingResult result, ListProductDetails list, String orderId) {if (result.getResponseCode() ! BillingClient.BillingResponseCode.OK){String msg Get Details Fails, code: result.getResponseCode() ,msg: result.getDebugMessage();UnityPlayer.UnitySendMessage(this.objectName, this.detailsFailMethodName, msg);return;}if (null list || list.size() 0) {Log.e(TAG, 没有查询到相关产品~~~~);UnityPlayer.UnitySendMessage(this.objectName, this.detailsFailMethodName, Not Search Product, Please check ProductID!);return;}if (orderId ! null orderId.length() 0){GoogleBillHelper.onOpenGooglePlay(this, UnityPlayer.currentActivity, list.get(0), orderId);productDetails list.get(0).getOneTimePurchaseOfferDetails();}String infoList ;for (ProductDetails details: list) {ProductDetails.OneTimePurchaseOfferDetails oneTimePurchaseOfferDetails details.getOneTimePurchaseOfferDetails();//注意如果手机语言是法语获取的商品价格是以 作为分隔符String info details.getProductId() |-| oneTimePurchaseOfferDetails.getFormattedPrice() |-| oneTimePurchaseOfferDetails.getPriceCurrencyCode() |-| oneTimePurchaseOfferDetails.getPriceAmountMicros();if (infoList.isEmpty()){infoList info;}else{infoList infoList ; info;}}UnityPlayer.UnitySendMessage(this.objectName, this.detailsSusMethodName, infoList);}/*** 商品消费成功** param code* param purchaseToken*/public void onConsumeSus(int code, String result, String purchaseToken, Purchase purchase) {AccountIdentifiers accountIdentifiers purchase.getAccountIdentifiers();String itemId purchase.getProducts().get(0);String msg code , result , purchaseToken , accountIdentifiers.getObfuscatedAccountId() , itemId;if (productDetails ! null){msg msg , productDetails.getPriceCurrencyCode() , productDetails.getPriceAmountMicros();}if (code BillingClient.BillingResponseCode.OK) {UnityPlayer.UnitySendMessage(this.objectName, this.paySuccessMethodName, msg);}else{UnityPlayer.UnitySendMessage(this.objectName, this.payFailMethodName, msg);}}public void onQueryPurchases(String txnid){UnityPlayer.UnitySendMessage(this.objectName, this.queryPurchasesMethodName, txnid);} }C#部分 IAPMangaer.cs namespace根据自己项目决定要不要写 using System; using System.Collections; using System.Collections.Generic; using UnityEngine;namespace xxx.Sdk {public enum BillingResponseCode{SERVICE_TIMEOUT -3,FEATURE_NOT_SUPPORTED -2,SERVICE_DISCONNECTED -1,OK 0,USER_CANCELED 1,SERVICE_UNAVAILABLE 2,BILLING_UNAVAILABLE 3,ITEM_UNAVAILABLE 4,DEVELOPER_ERROR 5,ERROR 6,ITEM_ALREADY_OWNED 7,ITEM_NOT_OWNED 8,}public class IAPManager{private bool initialize; #if UNITY_ANDROIDprivate AndroidJavaClass billingManager;private AndroidJavaClass billingHelper; #endifpublic event Actionbool, string OnPayEndResult;public event Actionbool, string OnPayResult;public event Actionbool, string OnDetailsSus;public event Actionbool, string OnQueryPurchasesResult;public void Initialize(){if (initialize){return;}#if UNITY_ANDROIDif (billingManager null){billingManager new AndroidJavaClass(com.dorocat.bombman.GoogleBillingManager);}if (billingHelper null){billingHelper new AndroidJavaClass(com.dorocat.bombman.GoogleBillHelper);}if (SdkMgr.currentActivity null) return;SdkMgr.currentActivity.Call(runOnUiThread, new AndroidJavaRunnable(() {billingManager.CallStatic(createClient, SdkMgr.currentActivity);})); #endifinitialize true;}public void StartConnection(){ #if UNITY_ANDROIDif (SdkMgr.currentActivity null) return;SdkMgr.currentActivity.Call(runOnUiThread, new AndroidJavaRunnable(() {billingManager.CallStatic(startConn);})); #endif}public void endConnection(){ #if UNITY_ANDROIDif (billingManager ! null){if (SdkMgr.currentActivity null) return;SdkMgr.currentActivity.Call(runOnUiThread, new AndroidJavaRunnable(() {billingManager.CallStatic(endConn);}));} #endif}public void pay(string itemId, string productType, string orderId){ #if UNITY_ANDROIDif (SdkMgr.currentActivity null) return;SdkMgr.currentActivity.Call(runOnUiThread, new AndroidJavaRunnable(() {var listener new AndroidJavaObject(com.dorocat.bombman.GoogleBillingListener,SdkMgr.GameObjectName,OnPaySuccess,OnProductDetailsSus,OnPayFail,OnPayEnd,OnQueryPurchases,OnProductDetailsSusFail);billingHelper.CallStatic(onQuerySkuDetailsAsync, listener, productType, itemId, orderId);})); #endif}public void getProductsDetail(string itemId, string productType){ #if UNITY_ANDROIDif (SdkMgr.currentActivity null) return;SdkMgr.currentActivity.Call(runOnUiThread, new AndroidJavaRunnable(() {var listener new AndroidJavaObject(com.dorocat.bombman.GoogleBillingListener,SdkMgr.GameObjectName,OnPaySuccess,OnProductDetailsSus,OnPayFail,OnPayEnd,OnQueryPurchases,OnProductDetailsSusFail);billingHelper.CallStatic(onQuerySkuDetailsAsync, listener, productType, itemId, );})); #endif}public void queryPurchases(string productType){ #if UNITY_ANDROIDif (SdkMgr.currentActivity null) return;SdkMgr.currentActivity.Call(runOnUiThread, new AndroidJavaRunnable(() {var listener new AndroidJavaObject(com.dorocat.bombman.GoogleBillingListener,SdkMgr.GameObjectName,OnPaySuccess,OnProductDetailsSus,OnPayFail,OnPayEnd,OnQueryPurchases,OnProductDetailsSusFail);billingHelper.CallStatic(queryPurchases, productType, listener);})); #endif}public void onPaySuccess(string msg){OnPayResult?.Invoke(true, msg);}public void onPayFail(string msg){OnPayResult?.Invoke(false, msg);}public void onProductDetailsSus(string msg){OnDetailsSus?.Invoke(true, msg);}public void onPayEnd(string msg){OnPayEndResult?.Invoke(true, msg);}public void onQueryPurchases(string msg){OnQueryPurchasesResult?.Invoke(true, msg);}public void onDeatilSusFail(string msg){OnDetailsSus?.Invoke(false, msg);}public bool getConnectionState(){ #if UNITY_ANDROIDreturn billingManager.GetStaticbool(isConnection); #elsereturn false; #endif}} }自行定义一个SdkManager.cs在这里面初始化包括在java层定义的回调函数名也要在这里实现 public static IAPManager billingManager null; public static IAPManager CreateBillingClient() {billingManager new IAPManager();billingManager.Initialize();return billingManager; }public void OnPaySuccess(string result) {if (billingManager ! null){billingManager.onPaySuccess(result);}else{current?.auth.OnPaySuccess(result);} }public void OnPayFail(string message) {if (billingManager ! null){billingManager.onPayFail(message);}else{current?.auth.OnPayFail(message);} }public void OnPayEnd(string result) {if (billingManager ! null){billingManager.onPayEnd(result);} }public void OnProductDetailsSus(string result) {if (billingManager ! null){billingManager.onProductDetailsSus(result);} }public void OnProductDetailsSusFail(string result) {if (billingManager ! null){billingManager.onDeatilSusFail(result);} }public void OnQueryPurchases(string result) {if (billingManager ! null){billingManager.onQueryPurchases(result);} }Lua部分 初始化支付SDK ---type xxx.Sdk.IAPManager App.billingSdk CS.BombMan.Sdk.SdkMgr.CreateBillingClient()调用支付 local billingProductType {INAPP inapp,SUBS subs, }---sdk支付--- function ShopMgr:pay(itemId, payCallBack, addInfo)if LuaClass.Application.isMobilePlatform thenlocal callbackcallback function(result,str)App.billingSdk:OnPayResult(-, callback)print(onPayResult,result,str)if payCallBack thenpayCallBack(result,str)endendif not App.billingSdk:getConnectionState() then--如果没有连上Google支付服务器开始连接App.billingSdk:StartConnection()returnendlocal payEndpayEnd function(result, msg)App.billingSdk:OnPayEndResult(-, payEnd)print(payEnd, msg)self.starPay falselocal infoList string.split(msg, ,)self:requestPayEnd(infoList[1], infoList[2], tonumber(infoList[3]), self.priceStrGoogle and self.priceStrGoogle[itemId][2] or nil, self.priceStrGoogle and tonumber(self.priceStrGoogle[itemId][3]) or nil, infoList[4], itemId, payCallBack)endlocal detailFaildetailFail function(result, msg)print(detailFail, result, msg)if not result thenApp.billingSdk:OnPayEndResult(-, payEnd)endself.starPay falseApp.billingSdk:OnDetailsSus(-, detailFail)endself:requestPayStart(itemId, addInfo, function ()App.billingSdk:OnPayEndResult(, payEnd)App.billingSdk:OnDetailsSus(, detailFail)App.billingSdk:pay(itemId, billingProductType.INAPP, StringUtil.obfuscate(App.playerMgr.data.id, pay))self.starPay falseend)end end检查补单 function ShopMgr:queryPurchases()if not self.isQuery thenlocal addCallBack function(result, str)print(onQueryPurchases, str)local infoList string.split(str, ,)local price self.priceStrGoogle and infoList[5] and self.priceStrGoogle[infoList[5]]self:requestPayEnd(infoList[1], infoList[3], tonumber(infoList[4]),price and price[2] or nil, price and tonumber(price[3]) or nil, infoList[2], infoList[5])endApp.billingSdk:OnQueryPurchasesResult(, addCallBack)endApp.billingSdk:queryPurchases(billingProductType.INAPP)self.isQuery true end获取谷歌商店内价格 function ShopMgr:getProductsByGoogle()if LuaClass.Application.platform LuaClass.RuntimePlatform.IPhonePlayer ornot isValid(App.billingSdk) thenreturnendif self.priceStrGoogle nil thenself.priceStrGoogle {}local templates LuaClass.DirectpurchaseDatatable:getAll()local idstr for i 1,#templates doidstr idstr..templates[i].ID..,endif idstr thenlocal callbackcallback function(result,str)print(getProductsByGoogle:,result,str)App.billingSdk:OnDetailsSus(-, callback)if result thenlocal strSP string.split(str,;)for i 1, #strSP dolocal productInfo string.split(strSP[i], |-|)self.priceStrGoogle[productInfo[1]] {--格式化后的价格 如HK$8.00[1] productInfo[2],--货币代码如HKD[2] productInfo[3],--微单位价格1,000,000 微单位等于 1 货币单位[3] productInfo[4],}endprint(productInfo, self.priceStrGoogle)self:queryPurchases()endendApp.billingSdk:OnDetailsSus(, callback)App.billingSdk:pay(idstr, billingProductType.INAPP, )endend end3. 导出工程打包测试 注意要导apk并且要带有调试标签直连手机Build即可包名和版本号要和Google Play后台上传的包一致确保测试机只登陆了一个谷歌测试账号 参考 https://blog.51cto.com/kenkao/5989952 https://www.cnblogs.com/fnlingnzb-learner/p/16385685.html 踩坑注意 1.手机语言是法语的话价格会用逗号代替小数点注意自己使用的分隔符例如 $1234,56 2.关闭订单这一步操作最好由后端处理以防客户端因为网络等原因关闭订单后无法通知后端发货 3.在拉起支付时如果需要设置ObfuscatedAccountId的话请确保每次传输的值都是一样的否则会出现用户支付遭拒的情况
http://www.hkea.cn/news/14296002/

相关文章:

  • 免费网站友情链接登录
  • 哪有做奇石网站悬停提示 wordpress
  • 上海网站制作电话制作自己的app多少钱
  • 做网站闵行个人域名注册流程
  • 网站建设贰金手指下拉壹玖深圳市建设工程质量检测中心网站
  • 虹口广州网站建设旅游业网站建设方案特点
  • 展示网站动画怎么做的seo教育培训机构
  • 常见的网站空间重庆网站seo按天计费
  • 如何设置个人网站visual studio做网站
  • 广西柳州网站制作公司网站推广的网站
  • 临沂企业建站系统外贸英语 网站
  • 中山市城乡建设局网站个体工商户经营范围网站开发
  • 韩国网站建设设置wordpress上传文件大小
  • 装潢公司网站设计与制作嘉峪关市建设局公示公告网站
  • 网站建设是指什么东莞玩具加工东莞网站建设
  • xp花生壳做网站网站没备案怎么做淘宝客
  • 昆明做网站建设的公司哪家好画画外包网站
  • 查看网站是由什么开源做的无锡定制网站制作公司
  • 正规品牌网站设计一般网站维护需要做什么
  • 淘宝客网站怎么做产品设计五个流程
  • 装饰网站建设的方案app推广联盟平台
  • 做网站主流用什么语言贵阳网站建设平台
  • 陕西网站建设哪家专业百度上能收到的企业名称网站怎么做
  • 官方网站建设银行年利息是多少cps推广是什么意思
  • 网站使用什么数据库公司网站建设会计处理
  • 企业网站子页面模板威海人社app下载官网2022
  • 从域名角度看网站建设注意事项企业画册的设计效果
  • 企业营销型网站推广方法宁波网站建设服务提供商
  • 做标书需要用到哪些网站查资料价格合理的网站建设
  • 有没有做衣服的网站如何设计网站以网络为中心的企业文化