Unity 支付
针对手机市场需要接入很多支付sdk,google iso 支付宝,微信等对接支付接口,许多第三方已经整合了这一部分代码,这里介绍一下google和ios支付接入,使用的是soomla插件
soomla插件介绍
官方网站:
https://soom.la/
包的下载网站:
http://download.csdn.net/detail/sxd612612/9700311
1.下载资源包后,导入unity中,包只支持unity5.0以上版本
2.将下面资源拷贝到你的工程中
3.配置soomla
google play会说到
工程中需要到StoreEvents prefab
3.代码
1.在你的 AndroidManifest.xml 增加权限 (for Google Play):
2.GooglePlayIabService.getInstance().setPublicKey(“[YOUR PUBLIC KEY FROM THE MARKET]”);
这里本地公钥
3.GooglePlayIabService.AllowAndroidTestPurchases = true; //如果你需要测试
4.打开商店服务
SoomlaStore.getInstance().startIabServiceInBg();
5.关闭商店服务
SoomlaStore.getInstance().stopIabServiceInBg();
文件 PayItem.cs 这里你需要继承IStoreAssets,仿照下面写一个即可
using System.Collections.Generic;
using Soomla.Store;
public class PayItem : IStoreAssets
{
#region Consts
private const string COIN_PACK_10_PRODUCT_ID = "coins_3";
private const string COIN_PACK_50_PRODUCT_ID = "coins_5";
private const string COIN_PACK_1000_PRODUCT_ID = "coins_10";
private const string SHIELD_PRODUCT_ID = "shield";
private const string SHIELD_PACK_5_PRODUCT_ID = "shields_5";
private const string NO_ADS_PRODUCT_ID = "no_ads";
private const string ARMOR_PRODUCT_ID = "armor";
private const string SOOMLA_SHIRT_PRODUCT_ID = "soomla_shirt";
private const string SPARTONIX_SHIRT_PRODUCT_ID = "spartonix_shirt";
private const string SHIELD_DURABILITY_PRODUCT_ID = "shield_dur_";
private const string SHIELD_DURABILITY_NAME = "Durability ";
private const string SHIELD_DURABILITY_DESC = "Increases shield durability to ";
#endregion
#region Categories
public static VirtualCategory WearableGearCategory = new VirtualCategory(
"WearableGear", new List<string>
{
ARMOR_PRODUCT_ID,
SOOMLA_SHIRT_PRODUCT_ID,
SPARTONIX_SHIRT_PRODUCT_ID
}
);
#endregion
#region Virtual Currencies
/// <summary>
/// A coin that serves as an in-game currency
/// </summary>
public static VirtualCurrency Coin = new VirtualCurrency(
"Coin", // Name
"Collect coins to buy items", // Description
"currency_coin" // Item ID
);
#endregion
#region Virtual Currency Packs
public static VirtualCurrencyPack CoinPack3 = new VirtualCurrencyPack(
"10 Coins", // Name
"This is a 10-coin pack", // Description
COIN_PACK_10_PRODUCT_ID, // Item ID
10, // Number of currencies in the pack
Coin.ItemId, // The currency associated with this pack
new PurchaseWithMarket( // Purchase type
COIN_PACK_10_PRODUCT_ID, // Product ID
0.99) // Initial price
);
public static VirtualCurrencyPack CoinPack5 = new VirtualCurrencyPack(
"50 Coins", // Name
"This is a 50-coin pack", // Description
COIN_PACK_50_PRODUCT_ID, // Item ID
50, // Number of currencies in the pack
Coin.ItemId, // The currency associated with this pack
new PurchaseWithMarket( // Purchase type
COIN_PACK_50_PRODUCT_ID, // Product ID
1.99) // Initial price
);
public static VirtualCurrencyPack CoinPack10 = new VirtualCurrencyPack(
"1000 Coins", // Name
"This is a 1000-coin pack", // Description
COIN_PACK_1000_PRODUCT_ID, // Item ID
1000, // Number of currencies in the pack
Coin.ItemId, // The currency associated with this pack
new PurchaseWithMarket( // Purchase type
COIN_PACK_1000_PRODUCT_ID, // Product ID
2.49) // Initial price
);
#endregion
#region Virtual Goods
/// <summary>
/// Shield that can be purchased for 150 coins.
/// </summary>
public static VirtualGood Shield = new SingleUseVG(
"Shield", // Name
"Shields you from monsters", // Description
SHIELD_PRODUCT_ID, // Item ID
new PurchaseWithVirtualItem( // Purchase type
Coin.ItemId, // Virtual item to pay with
150) // Payment amount
);
/// <summary>
/// Pack of 5 shields that can be purchased for $2.99.
/// </summary>
public static VirtualGood ShieldPack5 = new SingleUsePackVG(
Shield.ItemId, // Good Item ID
5, // Amount
"5 Shields", // Name
"This is a 5-shield pack", // Description
SHIELD_PACK_5_PRODUCT_ID, // Item ID
new PurchaseWithMarket( // Purchase type
SHIELD_PACK_5_PRODUCT_ID, // Product ID
2.99) // Initial price
);
/// <summary>
/// Remove ads from the game, purchased for $0.99.
/// </summary>
public static VirtualGood NoAds = new LifetimeVG(
"No Ads", // Name
"Remove ads forever", // Description
NO_ADS_PRODUCT_ID, // Item ID
new PurchaseWithMarket( // Purchase type
NO_ADS_PRODUCT_ID, // Product ID
0.99) // Initial price
);
#region Equipables
/// <summary>
/// An equipable weapon that can be purchased for 7 coins.
/// </summary>
public static VirtualGood Sword = new EquippableVG(
EquippableVG.EquippingModel.LOCAL, // Equipping Model
"Sword", // Name
"Slash your enemies!", // Description
"sword", // Item ID
new PurchaseWithVirtualItem( // Purchase type
Coin.ItemId, // Virtual item to pay with
7)); // Payment amount
/// <summary>
/// An equipable weapon that can be purchased for 7 coins.
/// </summary>
public static VirtualGood PlasmaGun = new EquippableVG(
EquippableVG.EquippingModel.LOCAL, // Equipping Model
"Plasma Gun", // Name
"Spray & Pray", // Description
"plasma_gun", // Item ID
new PurchaseWithVirtualItem( // Purchase type
Coin.ItemId, // Virtual item to pay with
7)); // Payment amount
/// <summary>
/// An equipable weapon that can be purchased for 7 coins.
/// </summary>
public static VirtualGood SoomlaBotSidekick = new EquippableVG(
EquippableVG.EquippingModel.LOCAL, // Equipping Model
"SoomlaBot Sidekick", // Name
"The best sidekick EVER!", // Description
"soomlabot_sidekick", // Item ID
new PurchaseWithVirtualItem( // Purchase type
Coin.ItemId, // Virtual item to pay with
7)); // Payment amount
/// <summary>
/// An equipable armor that can be purchased for 7 coins.
/// </summary>
public static VirtualGood Armor = new EquippableVG(
EquippableVG.EquippingModel.CATEGORY, // Equipping Model
"Armor", // Name
"Increases you defense", // Description
ARMOR_PRODUCT_ID, // Item ID
new PurchaseWithVirtualItem( // Purchase type
Coin.ItemId, // Virtual item to pay with
7)); // Payment amount
/// <summary>
/// An equipable shirt that can be purchased for 17 coins.
/// </summary>
public static VirtualGood SoomlaShirt = new EquippableVG(
EquippableVG.EquippingModel.CATEGORY, // Equipping Model
"Soomla Shirt", // Name
"Spread the word - Soomla's great!", // Description
SOOMLA_SHIRT_PRODUCT_ID, // Item ID
new PurchaseWithVirtualItem( // Purchase type
Coin.ItemId, // Virtual item to pay with
17)); // Payment amount
/// <summary>
/// An equipable shirt that can be purchased for 27 coins.
/// </summary>
public static VirtualGood SpartonixShirt = new EquippableVG(
EquippableVG.EquippingModel.CATEGORY, // Equipping Model
"Spartonix Shirt", // Name
"Look cool :)", // Description
SPARTONIX_SHIRT_PRODUCT_ID, // Item ID
new PurchaseWithVirtualItem( // Purchase type
Coin.ItemId, // Virtual item to pay with
27)); // Payment amount
/// <summary>
/// A playable character that can be purchased for 27 coins.
/// </summary>
public static VirtualGood Character1 = new EquippableVG(
EquippableVG.EquippingModel.GLOBAL, // Equipping Model
"Character 1", // Name
"Character #1", // Description
"character_1", // Item ID
new PurchaseWithVirtualItem( // Purchase type
Coin.ItemId, // Virtual item to pay with
0)); // Payment amount
/// <summary>
/// A playable character that can be purchased for 27 coins.
/// </summary>
public static VirtualGood Character2 = new EquippableVG(
EquippableVG.EquippingModel.GLOBAL, // Equipping Model
"Character 2", // Name
"Character #2", // Description
"character_2", // Item ID
new PurchaseWithVirtualItem( // Purchase type
Coin.ItemId, // Virtual item to pay with
1000)); // Payment amount
#endregion
#region Upgrades
/// <summary>
/// Upgrade shield durability level 1
/// </summary>
public static VirtualGood ShieldDurability1 = CreateUpgrade(
Shield, // Upgraded Item
SHIELD_DURABILITY_PRODUCT_ID, // Item ID
SHIELD_DURABILITY_NAME + 3, // Name
SHIELD_DURABILITY_DESC, // Decription
1, // Level
0); // Price (Costs 0 so it can be set as default)
/// <summary>
/// Upgrade shield durability level 2
/// </summary>
public static VirtualGood ShieldDurability2 = CreateUpgrade(
Shield, // Upgraded Item
SHIELD_DURABILITY_PRODUCT_ID, // Item ID
SHIELD_DURABILITY_NAME + 7, // Name
SHIELD_DURABILITY_DESC, // Decription
2, // Level
12); // Price
/// <summary>
/// Upgrade shield durability level 3
/// </summary>
public static VirtualGood ShieldDurability3 = CreateUpgrade(
Shield, // Upgraded Item
SHIELD_DURABILITY_PRODUCT_ID, // Item ID
SHIELD_DURABILITY_NAME + 15, // Name
SHIELD_DURABILITY_DESC, // Decription
3, // Level
30); // Price
/// <summary>
/// Upgrade shield durability level 4
/// </summary>
public static VirtualGood ShieldDurability4 = CreateUpgrade(
Shield, // Upgraded Item
SHIELD_DURABILITY_PRODUCT_ID, // Item ID
SHIELD_DURABILITY_NAME + 32, // Name
SHIELD_DURABILITY_DESC, // Decription
4, // Level
80); // Price
/// <summary>
/// Upgrade shield durability level 5
/// </summary>
public static VirtualGood ShieldDurability5 = CreateUpgrade(
Shield, // Upgraded Item
SHIELD_DURABILITY_PRODUCT_ID, // Item ID
SHIELD_DURABILITY_NAME + 100, // Name
SHIELD_DURABILITY_DESC, // Decription
5, // Level
200, // Price
true); // Last
#endregion
#endregion
#region Private Functions
private static VirtualGood CreateUpgrade(VirtualItem upgradedGood, string upgradeItemId, string upgradeName, string upgradeDescription, int level, int price, bool isLast = false)
{
var prevItemId = level > 1 ? upgradeItemId + (level - 1) : null;
var nextItemId = isLast ? null : upgradeItemId + (level + 1);
return new UpgradeVG(
upgradedGood.ItemId, // Good Item ID
nextItemId, // Next Upgrade Item ID
prevItemId, // Previous Upgrade Item ID
upgradeName, // Name
upgradeDescription + level, // Description
upgradeItemId + level, // Item ID
new PurchaseWithVirtualItem( // Purchase type
Coin.ItemId, // Virtual item to pay with
price) // Payment amount
);
}
#endregion
#region Public Functions
public int GetVersion()
{
return 1;
}
public VirtualCurrency[] GetCurrencies()
{
return new[] { Coin };
}
public VirtualGood[] GetGoods()
{
return new[]
{
Shield,
ShieldPack5,
NoAds,
Sword,
PlasmaGun,
SoomlaBotSidekick,
Armor,
SoomlaShirt,
SpartonixShirt,
Character1,
Character2,
ShieldDurability1,
ShieldDurability2,
ShieldDurability3,
ShieldDurability4,
ShieldDurability5
};
}
public VirtualCurrencyPack[] GetCurrencyPacks()
{
return new[] { CoinPack3, CoinPack5, CoinPack10 };
}
public VirtualCategory[] GetCategories()
{
return new[] { WearableGearCategory };
}
#endregion
}
文件PayHelp.cs
using UnityEngine;
using System.Collections;
using game;
using Game;
using Soomla.Store;
namespace game
{
public class PayHelper
{
private static PayHelper _instance = null;
private bool _holdOn = false;
private PayItem _gameAssets;
public static PayHelper Instance
{
get
{
if (_instance == null)
_instance = new PayHelper();
return _instance;
}
}
public void onInit()
{
if (!SoomlaStore.Initialized)
{
SoomlaStore.Initialize(getGameAssets());
}
SoomlaStore.StartIabServiceInBg();
StoreEvents.OnCurrencyBalanceChanged += onCurrencyBalanceChanged;
StoreEvents.OnUnexpectedStoreError += onUnexpectedStoreError;
StoreEvents.OnBillingNotSupported += onBillingNotSupported;
StoreEvents.OnMarketRefund += onMarketRefund;
StoreEvents.OnMarketPurchaseCancelled += onMarketPurchaseCancelled;
}
public PayItem getGameAssets()
{
if(_gameAssets==null)
_gameAssets = new PayItem();
return _gameAssets;
}
public void onExit()
{
if (StoreEvents.OnCurrencyBalanceChanged != null)
StoreEvents.OnCurrencyBalanceChanged -= onCurrencyBalanceChanged;
if (StoreEvents.OnUnexpectedStoreError != null)
StoreEvents.OnUnexpectedStoreError -= onUnexpectedStoreError;
if (StoreEvents.OnBillingNotSupported != null)
StoreEvents.OnBillingNotSupported -= onBillingNotSupported;
if (StoreEvents.OnMarketRefund != null)
StoreEvents.OnMarketRefund -= onMarketRefund;
if (StoreEvents.OnMarketPurchaseCancelled != null)
StoreEvents.OnMarketPurchaseCancelled -= onMarketPurchaseCancelled;
SoomlaStore.StopIabServiceInBg();
}
/// <summary>
/// 内购支付
/// </summary>
/// <param name="productId">应用内购商品的ID</param>
/// <param name="payload">购买成功后的信息</param>
public void onPay(string productId, string payload)
{
SoomlaStore.BuyMarketItem(productId, payload);
}
/// <summary>
/// 交易成功回调
/// </summary>
/// <param name="virtualCurrency"></param>
/// <param name="balance"></param>
/// <param name="amountAdded"></param>
public void onCurrencyBalanceChanged(VirtualCurrency virtualCurrency, int balance, int amountAdded)
{
//TODO
}
/// <summary>
/// 交易失败回调
/// </summary>
/// <param name="errorCode"></param>
public void onUnexpectedStoreError(int errorCode)
{
//code=3 无法连接到APP Stroe
switch (errorCode)
{
//TODO
}
HoldOn = false;
}
/// <summary>
/// 交易不支持
/// </summary>
public void onBillingNotSupported()
{
//TODO
HoldOn = false;
}
/// <summary>
/// 退款
/// </summary>
/// <param name="item"></param>
public void onMarketRefund(PurchasableVirtualItem item)
{
//TODO
HoldOn = false;
}
/// <summary>
/// 交易取消
/// </summary>
/// <param name="item"></param>
public void onMarketPurchaseCancelled(PurchasableVirtualItem item)
{
//TODO
HoldOn = false;
}
public bool HoldOn
{
get
{
return _holdOn;
}
set
{
_holdOn = value;
//waiting.SetActive(value);
}
}
}
}
使用 TestSomla.cs
void Start()
{
#if !UNITY_EDITOR && (UNITY_IPHONE || UNITY_ANDROID)
PayHelper.Instance.onInit();
#endif
}
void OnGUI()
{
if (GUILayout.Button("金币1", GUILayout.Height(100), GUILayout.Width(150)))
{
PayHelper.Instance.onPay("googleplay后台配置的商品ID_1001", "coins");
}
if (GUILayout.Button("金币2", GUILayout.Height(100), GUILayout.Width(150)))
{
PayHelper.Instance.onPay("googleplay后台配置的商品ID_1002", "golds");
}
}
Google play
参考网站:
http://blog.csdn.net/qq15233635728/article/details/44015225
http://www.ithao123.cn/content-5719778.html
需要一个翻*墙软件
需要注册一个Gmail账号
https://mail.google.com/mail/注册Google 开发者账号
https://play.google.com/apps/publish/signup/需要一张信用卡,支付25$注册开发者账户
添加一个应用程序,上传你的apk文件
注意google 上传文件大小不能大于50M,所有我们需要分包上传,google需要上传两次才会出现扩展包上传界面,此外你需要有效的签名
a. 分包
b. 再次上传
c. 签名
发布你的应用程序,如果不能发布请查看原因
配置smoola
等待三五个小时(google会审核你的应用程序),得到一个开发者的共享下载链接地址
将地址在手机端输入
ios 支付
参考网站(此类网站比较多你可以百度一下)(略)
- 配置
待续 - 代码
待续