开发环境Visual Studio 2015,Xamarin 3.11.1537,Xamarin Android5.1.7.12

下载支付宝移动支付的SDKhttp://doc.open.alipay.com/doc2/detail?treeId=54&articleId=103419&docType=1),找到AndriudSDK,其中有一个alipaySDK-20151014.jar(这个版本,以后肯定会变化),这是我们使用的重点。

  • 在Visual Studio中创建一个绑定库文件

    wKioL1YwK0mglB9tAASWmxJ4F8g851.jpg

    把支付宝的alipaySDK-20151014.jar添加到Jars文件夹下,先中alipaySDK-20151014.jar,打开属性窗口,设置生成操作为EmbeddedJar,库文件搞定。

  • Android中使用绑定库文件

    在Visual Studio中创建一个BlankApp应用,然后在打开项目属性,Android Manifest选项卡,在Required permissions中选择ACCESS_WIFI_STATE和INTERNET权限,添加绑定库生成的dll到当前项目的引用中。

    添加签名生成类

using System;
using System.Text;
using System.IO;
using System.Security.Cryptography;namespace App1
{class SignatureUtils{/// <summary>/// 签名/// </summary>/// <param name="content">需要签名的内容</param>/// <param name="privateKey">私钥</param>/// <returns></returns>public static string Sign(string content, string privateKey){      byte[] Data = Encoding.GetEncoding("utf-8").GetBytes(content);RSACryptoServiceProvider rsa = DecodePemPrivateKey(privateKey);SHA1 sh = new SHA1CryptoServiceProvider();byte[] signData = rsa.SignData(Data, sh);sh.Clear();return Convert.ToBase64String(signData);}/// <summary>/// 对prikey进行处理,C#API默认的prikey是xml格式的,所以需要进行处理/// </summary>/// <param name="pemstr"></param>/// <returns></returns>private static RSACryptoServiceProvider DecodePemPrivateKey(String pemstr){byte[] pkcs8privatekey;pkcs8privatekey = Convert.FromBase64String(pemstr);if (pkcs8privatekey != null){RSACryptoServiceProvider rsa = DecodePrivateKeyInfo(pkcs8privatekey);return rsa;}elsereturn null;}/// <summary>/// 转换prikey/// </summary>/// <param name="pkcs8"></param>/// <returns></returns>private static RSACryptoServiceProvider DecodePrivateKeyInfo(byte[] pkcs8){byte[] SeqOID = { 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00 };byte[] seq = new byte[15];MemoryStream mem = new MemoryStream(pkcs8);int lenstream = (int)mem.Length;BinaryReader binr = new BinaryReader(mem);  byte bt = 0;ushort twobytes = 0;try{twobytes = binr.ReadUInt16();if (twobytes == 0x8130) binr.ReadByte();   else if (twobytes == 0x8230)binr.ReadInt16();  elsereturn null;bt = binr.ReadByte();if (bt != 0x02)return null;twobytes = binr.ReadUInt16();if (twobytes != 0x0001)return null;seq = binr.ReadBytes(15);      if (!CompareBytearrays(seq, SeqOID))   return null;bt = binr.ReadByte();if (bt != 0x04) return null;bt = binr.ReadByte();      if (bt == 0x81)binr.ReadByte();elseif (bt == 0x82)binr.ReadUInt16();byte[] rsaprivkey = binr.ReadBytes((int)(lenstream - mem.Position));RSACryptoServiceProvider rsacsp = DecodeRSAPrivateKey(rsaprivkey);return rsacsp;}catch (Exception){return null;}finally { binr.Close(); }}private static bool CompareBytearrays(byte[] a, byte[] b){if (a.Length != b.Length)return false;int i = 0;foreach (byte c in a){if (c != b[i])return false;i++;}return true;}/// <summary>/// 处理私钥/// </summary>/// <param name="privkey"></param>/// <returns></returns>private static RSACryptoServiceProvider DecodeRSAPrivateKey(byte[] privkey){byte[] MODULUS, E, D, P, Q, DP, DQ, IQ;MemoryStream mem = new MemoryStream(privkey);BinaryReader binr = new BinaryReader(mem);   byte bt = 0;ushort twobytes = 0;int elems = 0;try{twobytes = binr.ReadUInt16();if (twobytes == 0x8130) binr.ReadByte();    else if (twobytes == 0x8230)binr.ReadInt16();   elsereturn null;twobytes = binr.ReadUInt16();if (twobytes != 0x0102) return null;bt = binr.ReadByte();if (bt != 0x00)return null;elems = GetIntegerSize(binr);MODULUS = binr.ReadBytes(elems);elems = GetIntegerSize(binr);E = binr.ReadBytes(elems);elems = GetIntegerSize(binr);D = binr.ReadBytes(elems);elems = GetIntegerSize(binr);P = binr.ReadBytes(elems);elems = GetIntegerSize(binr);Q = binr.ReadBytes(elems);elems = GetIntegerSize(binr);DP = binr.ReadBytes(elems);elems = GetIntegerSize(binr);DQ = binr.ReadBytes(elems);elems = GetIntegerSize(binr);IQ = binr.ReadBytes(elems);CspParameters cspParams = new CspParameters();cspParams.Flags = CspProviderFlags.UseMachineKeyStore;//System.Security.Cryptography.RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(1024, cspParams); RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(1024);RSAParameters RSAparams = new RSAParameters();RSAparams.Modulus = MODULUS;RSAparams.Exponent = E;RSAparams.D = D;RSAparams.P = P;RSAparams.Q = Q;RSAparams.DP = DP;RSAparams.DQ = DQ;RSAparams.InverseQ = IQ;RSA.ImportParameters(RSAparams);return RSA;}catch (Exception){return null;}finally { binr.Close(); }}/// <summary>/// 获取binr的长度/// </summary>/// <param name="binr"></param>/// <returns></returns>private static int GetIntegerSize(BinaryReader binr){byte bt = 0;byte lowbyte = 0x00;byte highbyte = 0x00;int count = 0;bt = binr.ReadByte();if (bt != 0x02)     return 0;bt = binr.ReadByte();if (bt == 0x81)count = binr.ReadByte();    elseif (bt == 0x82){highbyte = binr.ReadByte(); lowbyte = binr.ReadByte();byte[] modint = { lowbyte, highbyte, 0x00, 0x00 };count = BitConverter.ToInt32(modint, 0);}else{count = bt;     }while (binr.ReadByte() == 0x00){   count -= 1;}binr.BaseStream.Seek(-1, SeekOrigin.Current);       return count;}}
}

在主程序中添加如下代码:

using System;
using Android.App;
using Android.Widget;
using Android.OS;
using Java.Net;namespace App1
{[Activity(Label = "App1", MainLauncher = true)]public class MainActivity : Activity{ // 合作商户ID。用签约支付宝账号登录ms.alipay.com后,在账户信息页面获取。public static string PARTNER = "替换你支付宝申请的partner";// 商户收款的支付宝账号public static string SELLER = "替换你支付宝申请的seller";//商户私密string RSA_PRIVATE = "替换你支付宝申请的private_key";
;protected override void OnCreate(Bundle bundle){base.OnCreate(bundle);SetContentView(Resource.Layout.Main);Button button = FindViewById<Button>(Resource.Id.MyButton);button.Click += HandleClick;}void HandleClick(object sender, EventArgs e){System.Threading.Thread the = new System.Threading.Thread(Pay);the.Start();}void Pay(){ var con = getOrderInfo("test", "testbody");var sign = SignatureUtils.Sign(con, RSA_PRIVATE);sign = URLEncoder.Encode(sign, "utf-8");con += "&sign=\"" + sign + "\"&" + MySignType;Com.Alipay.Sdk.App.PayTask pa = new Com.Alipay.Sdk.App.PayTask(this);var result = pa.Pay(con);//调用结果查看result中是否返回是90000,如果是,则成功      }#region 组合public String getOrderInfo(String subject, String body){ // 签约合作者身份IDString orderInfo = "partner=" + "\"" + PARTNER + "\""; // 签约卖家支付宝账号orderInfo += "&seller_id=" + "\"" + SELLER + "\""; // 商户网站唯一订单号orderInfo += "&out_trade_no=" + "\"DJ" + DateTime.Now.ToString("yyyyMMddhhmmss") + "\""; // 商品名称orderInfo += "&subject=" + "\"" + subject + "\""; // 商品详情orderInfo += "&body=" + "\"" + body + "\""; // 商品金额orderInfo += "&total_fee=" + "\"" + 0.01 + "\""; // 服务器异步通知页面路径orderInfo += "&notify_url=" + "\"" + "http://notify.msp.hk/notify.htm"+ "\""; // 服务接口名称, 固定值

orderInfo +="&service=\"mobile.securitypay.pay\"";

//支付类型,固定值

orderInfo +="&payment_type=\"1\"";

//参数编码,固定值

orderInfo +="&_input_charset=\"utf-8\"";

//设置未付款交易的超时时间

//默认30分钟,一旦超时,该笔交易就会自动被关闭。

//取值范围:1m15d

// m-分钟,h-小时,d-天,1c-当天(无论交易何时创建,都在0点关闭)。

//该参数数值不接受小数点,如1.5h,可转换为90m

orderInfo +="&it_b_pay=\"30m\"";

// extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付

// orderInfo += "&extern_token=" + "\"" + extern_token + "\"";

//支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空

orderInfo +="&return_url=\"m.alipay.com\"";

//调用银行卡支付,需配置此参数,参与签名,固定值(需要签约《无线银行卡快捷支付》才能使用)

// orderInfo += "&paymethod=\"expressGateway\"";

returnorderInfo;

}

publicStringMySignType

{

get

{

return"sign_type=\"RSA\"";

}

}

#endregion

}

}

源代码见附件

Xamarin只言片语3——Xamarin.Android下支付宝(Alipay SDK)使用相关推荐

  1. Xamarin只言片语1——Xamarin下的弹框

    有一段时间没有写博客了,一是因为身体原因,二是因为需要充充电.过去的一段时间,做了一些xamarin的开发,有一些小的心得,就想着把用过的一些知识点共享出来,给大家分享,让学习xamrin的人少走一些 ...

  2. Android集成支付宝支付SDK,实现支付功能

    官方集成文档地址:https://docs.open.alipay.com/204/105296/ 一.导入支付宝SDK 1.将 alipaySdk-15.6.5-20190718211159.aar ...

  3. Xamarin只言片语2——Xamarin下的web api操作

    在很多时候,我们是希望手机app是要和服务端关联,并获取服务端的数据的,本篇博文我们看一下在xmarin下,怎么和用web api的方式与服务端连接并获取数据. 首先看web api的开发,本实例是用 ...

  4. Xamarin只言片语4——Xamarin.Android百度地图绑定

    先下载百度地图http://lbsyun.baidu.com/sdk/download?selected=mapsdk_basicmap,mapsdk_searchfunction,mapsdk_lb ...

  5. Xamarin只言片语系列

    把自己写xamarin中的一些知识点记录下来,分享给大家,欢迎指正. Xamarin只言片语1--Xamarin下的弹框 Xamarin只言片语2--Xamarin下的web api操作 更新中--

  6. Android实现支付宝AR功能,Android接入支付宝实现支付功能实例

    我本来是想直接讲Android支付这一块的,包括支付宝,微信,其他第三方整合支付等,但是微信开放平台他对我的账号做了限制,所有我今天就先把重心放在支付宝的支付上,也算是写得尽可能详细些吧,毕竟是第三方 ...

  7. Android接入支付宝实现支付功能

    Android接入支付宝实现支付功能 我本来是想直接讲Android支付这一块的,包括支付宝,微信,其他第三方整合支付等,但是微信开放平台他对我的账号做了限制,所有我今天就先把重心放在支付宝的支付上, ...

  8. android接入支付宝提示支付取消的方法处理

    最近支付demo测试通过,复制到项目中总是提示支付取消 支付取消是自己写的 @Override public void onCanceled(String result) {Toast.makeTex ...

  9. android 支付宝 收款,Android支付——支付宝支付

    相比之前的支付宝sdk,新版的sdk不再判断App客户端是否安装了支付宝客户端.如果用户安装了支付宝,将跳到支付宝客户端支付:如果用户没有安装支付宝客户端,将跳到 sdk中的H5PayActivity ...

最新文章

  1. c语言课设代写一般多少钱_厕所疏通一般多少钱
  2. 【python自动化办公03】word操作-文档内容替换
  3. 调用百度报Cannot read property ‘lng‘ of null错误
  4. share-Nothing原理
  5. gtk+学习笔记(五)
  6. flowable画图教程_JeeGit企业级快速开发平台-JeeSite4 Flowable入门教程
  7. win7下安装python失败问题_win7下安装ipython失败
  8. paascloud商城系统源码v2.0-完整购物流程和后端运营平台
  9. SQL2008附加数据库只读怎么修改
  10. QTreeView处理大量数据(使用1000万条数据,每次都只是部分刷新)
  11. Class.isAssignableFrom instanceof 区别
  12. _beginthread 和 CreateThread 区别
  13. ECharts 简明教程,用js输出图表
  14. CMPSS 涡扇发动机模型
  15. java swing界面设计_java swing界面设计
  16. 武-NC15522(Dijsktra最短路算法)
  17. linux下解压rar和7z压缩文件
  18. UT2016学习笔记
  19. Gradle之task的使用
  20. [RK3288][Android6.0] 调试笔记 --- apk安装添加黑名单

热门文章

  1. WebLogic的下载与安装(图文教程)
  2. 【第1篇】Python爬虫实战-王者荣耀高清壁纸下载
  3. Bootstrap table列内容过长,显示固定长度,超过内容隐藏
  4. java oracle 换行,oracle中Clob字段中的回车换行在jsp中展示的问题
  5. Spring Boot Lombok配置
  6. python命令行参数有什么用_一文看懂命令行参数的用法——Python中的getopt神器
  7. mybatis mysql schema_学习Mybatis与mysql数据库的示例笔记
  8. F. Gourmet and Banquet(贪心加二分求值)
  9. webstorm护眼绿柔主题分享(JetBrains都可用)
  10. Spring Boot 发送邮件