1. 首先去支付宝官网下载开发者文档

2. 然后按着开发者文档将支付宝的sdk导入到你的工程中,并关联到工程中,步骤入下图:

(1)将从支付宝官方网站获得的支付宝的sdk的jar包拷贝到工程中的libs目录下,如图

(2)右键工程选择Properties,弹出如下窗口,首先选择1,其次选中2,最后点击3将拷到工程中的三个支付宝的jar包一一关联到工程中

3.  最后修改工程的AndroidManifest.xml文件,添加新的权限和支付宝的Activity,代码如下:

新权限:

  1. <uses-permission android:name="android.permission.INTERNET" />
  2. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  3. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  4. <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  5. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  6. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

支付宝的Activity:

  1. <!-- alipay sdk begin -->
  2. <activity
  3. android:name="com.alipay.sdk.app.H5PayActivity"
  4. android:configChanges="orientation|keyboardHidden|navigation"
  5. android:exported="false"
  6. android:screenOrientation="behind"
  7. android:windowSoftInputMode="adjustResize|stateHidden" >
  8. </activity>
  9. <!-- alipay sdk end -->

到此为止支付宝sdk导入工程的工作算是完成了,接下来就是使用sdk完成付费了。

虽然破坏了java的封装性,但是为了方便起见我还是将支付宝的使用写到了一个java文件里了,我把使用放到了工程自带的HelloCpp.java文件中了,代码如/****************************************************************************Copyright (c) 2010-2012 cocos2d-x.orghttp://www.cocos2d-x.org

  1. Permission is hereby granted, free of charge, to any person obtaining a copy
  2. of this software and associated documentation files (the "Software"), to deal
  3. in the Software without restriction, including without limitation the rights
  4. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  5. copies of the Software, and to permit persons to whom the Software is
  6. furnished to do so, subject to the following conditions:
  7.  
  8. The above copyright notice and this permission notice shall be included in
  9. all copies or substantial portions of the Software.
  10.  
  11. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  12. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  13. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  14. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  15. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  16. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  17. THE SOFTWARE.
  18. ****************************************************************************/
  19. package org.cocos2dx.hellocpp2;
  20.  
  21. import java.io.UnsupportedEncodingException;
  22. import java.net.URLEncoder;
  23. import java.text.SimpleDateFormat;
  24. import java.util.Date;
  25. import java.util.Locale;
  26. import java.util.Random;
  27.  
  28. import org.cocos2dx.lib.Cocos2dxActivity;
  29.  
  30. import android.os.Bundle;
  31. import android.os.Handler;
  32. import android.os.Message;
  33. import android.text.TextUtils;
  34. import android.util.Log;
  35. import android.view.View;
  36. import android.widget.Toast;
  37.  
  38. import com.alipay.sdk.app.PayTask;
  39.  
  40. public class HelloCpp extends Cocos2dxActivity{
  41.  
  42. //private long exitTime = 0;
  43.  
  44. // 私有的类对象
  45. private static HelloCpp hiCpp = null;
  46.  
  47. // 传回支付结果
  48. public static native void payResultState(int payState);

  49.   // 以下参数根据自己的实际情况而定
  50. //商户PID
  51. public static final String PARTNER = "2088811977704990";
  52. //商户收款账号
  53. public static final String SELLER = "dev@ifensi.com";
  54. //商户私钥,pkcs8格式
  55. public static final String RSA_PRIVATE =
  56. "MIICXQIBAAKBgQDlQ468L1A7Q+GG80/Z8f3IsSiiFIluSxfTTSuJ/XSPzvYS+bMZ"
  57. +"AQLMqq/nGhkp+1Q5pHF9LAQtQS3gL2pqzbKdtvZSsy/tNFFQcGCsgK2ygMl+MW/F"
  58. +"g/ufx7c1jy1kZAeDyl1m302dnRrtSgDalkgH7FKRcmDxbXPTnFGHbg9zMQIDAQAB"
  59. +"AoGAa28wGQF28H7L1Yh5V+FtkrlqGCHVkQjBfnRAPea205kheRzoD4SIwk4OJhb1"
  60. +"ydWLz4M+53BT+Lz9eXveu3PvCdQe9zMIVC5dKUNVYCvvcHZ+Ot8HriiuwGPb3Quu"
  61. +"twbnLGM5gxxPDo0yUyWrfaVn/qR35mS6TDfmgowVG8CmBpECQQDzuhodR/Jgxrtn"
  62. +"tka+88alyy+BfjUZqNloPuE7JfXrpOxH5lodk7Y4lTki/dlo5BrK+hrismLFr9Du"
  63. +"ueAJ7G9dAkEA8M8C6VnpUMAK5+rYcjKnQssDqcMfurKYEil1BD/TUdSbLI6v8p02"
  64. +"mv1ApuTVtQQypZJKIFfurGk0g0QlvzLZ5QJAGfY38+iHDAH/UnPbI1oKTfzPyaZs"
  65. +"95fB2NXh3hAUGw7NUHdcIAxs+6gBlxWdRAwQQpDTrlQ8KzyoL9XC5Ku3zQJBALO8"
  66. +"j5vEtFTFQl6f9zYlgJpmFTHcpg4fx0mnD+RAD2aAneHADquzlFJSvLLVEn2tyG+0"
  67. +"pQdHGqotTDi94L65IdECQQDb1h+5kugCu47IxsDkrLRsKVcr8dSDMORyeT1L0HWR"
  68. +"ctramBu+2PBz2UKC6+9dQ+ZQH4XTKpBSvkyZH4mYi1de";
  69. //支付宝公钥
  70. public static final String RSA_PUBLIC = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnxj/9qwVfgoUh/y2W89L6BkRAFljhNhgPdyPuBV64bfQNN1PjbCzkIM6qRdKBoLPXmKKMiFYnkd6rAoprih3/PrQEB/VsW8OoM8fxn67UDYuyBTqA23MML9q1+ilIZwBC2AQ2UBVOrFXfFl75p6/B5KsiNG9zpgmLCUYuLkxpLQIDAQAB";
  71.  
  72. private static final int SDK_PAY_FLAG = 1;
  73.  
  74. private static final int SDK_CHECK_FLAG = 2;
  75.  
  76. // 支付结果的处理(接收子线程反馈回来的消息)
  77. private Handler mHandler = new Handler() {
  78.  
  79. public void handleMessage(Message msg) {
  80. switch (msg.what) {
  81. case SDK_PAY_FLAG: {
  82. PayResult payResult = new PayResult((String) msg.obj);
  83.  
  84. // 支付宝返回此次支付结果及加签,建议对支付宝签名信息拿签约时支付宝提供的公钥做验签
  85. String resultInfo = payResult.getResult();
  86.  
  87. String resultStatus = payResult.getResultStatus();
  88.  
  89. // 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档
  90. if (TextUtils.equals(resultStatus, "9000")) {
  91. //Toast.makeText(HelloCpp.this, "支付成功", Toast.LENGTH_SHORT).show();
  92. HelloCpp.payResultState( 1 );
  93. } else {
  94. // 判断resultStatus 为非“9000”则代表可能支付失败
  95. // “8000”代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)
  96. if (TextUtils.equals(resultStatus, "8000")) {
  97. // Toast.makeText(HelloCpp.this, "支付结果确认中", Toast.LENGTH_SHORT).show();
  98. HelloCpp.payResultState( 3 );
  99. } else {
  100. // 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误
  101. // Toast.makeText(HelloCpp.this, "支付失败", Toast.LENGTH_SHORT).show();
  102. HelloCpp.payResultState( 2 );
  103. }
  104. }
  105. break;
  106. }
  107. case SDK_CHECK_FLAG: {
  108. Toast.makeText(HelloCpp.this, "检查结果为:" + msg.obj,
  109. Toast.LENGTH_SHORT).show();
  110. break;
  111. }
  112. default:
  113. break;
  114. }
  115. };
  116.  
  117. };
  118.  
  119. protected void onCreate(Bundle savedInstanceState){
  120. super.onCreate(savedInstanceState);
  121. hiCpp = this;
  122. }
  123.  
  124. public static Object rtnActivity() {
  125. System.out.println("----------rtnActivity");
  126. return hiCpp ;
  127. }
  128.  
  129. static {
  130. System.loadLibrary("hellocpp");
  131. }
  132.  
  133. /**
  134. * call alipay sdk pay. 调用SDK支付
  135. *
  136. */
  137. public void pay(String title, String content, float f) {
  138.  
  139. String price = Float.toString( f );
  140. // 订单
  141. String orderInfo = getOrderInfo( title, content, price );
  142.  
  143. // 对订单做 RSA 签名
  144. String sign = sign(orderInfo);
  145. try {
  146. // 仅需对sign 做URL编码
  147. sign = URLEncoder.encode(sign, "UTF-8");
  148. } catch (UnsupportedEncodingException e) {
  149. e.printStackTrace();
  150. }
  151.  
  152. // 完整的符合支付宝参数规范的订单信息
  153. final String payInfo = orderInfo + "&sign=\"" + sign + "\"&"
  154. + getSignType();
  155.  
  156. Runnable payRunnable = new Runnable() {
  157.  
  158. @Override
  159. public void run() {
  160. // 构造PayTask 对象
  161. PayTask alipay = new PayTask(HelloCpp.this);
  162. // 调用支付接口,获取支付结果
  163. String result = alipay.pay(payInfo);
  164.  
  165. Message msg = new Message();
  166. msg.what = SDK_PAY_FLAG;
  167. msg.obj = result;
  168. mHandler.sendMessage(msg);
  169. }
  170. };
  171.  
  172. // 必须异步调用
  173. Thread payThread = new Thread(payRunnable);
  174. payThread.start();
  175. }
  176.  
  177. /**
  178. * check whether the device has authentication alipay account.
  179. * 查询终端设备是否存在支付宝认证账户
  180. *
  181. */
  182. public void check(View v) {
  183. Runnable checkRunnable = new Runnable() {
  184.  
  185. @Override
  186. public void run() {
  187. // 构造PayTask 对象
  188. PayTask payTask = new PayTask(HelloCpp.this);
  189. // 调用查询接口,获取查询结果
  190. boolean isExist = payTask.checkAccountIfExist();
  191.  
  192. Message msg = new Message();
  193. msg.what = SDK_CHECK_FLAG;
  194. msg.obj = isExist;
  195. mHandler.sendMessage(msg);
  196. }
  197. };
  198.  
  199. Thread checkThread = new Thread(checkRunnable);
  200. checkThread.start();
  201.  
  202. }
  203.  
  204. /**
  205. * get the sdk version. 获取SDK版本号
  206. *
  207. */
  208. public void getSDKVersion() {
  209. PayTask payTask = new PayTask(this);
  210. String version = payTask.getVersion();
  211. Toast.makeText(this, version, Toast.LENGTH_SHORT).show();
  212. }
  213.  
  214. /**
  215. * create the order info. 创建订单信息
  216. *
  217. */
  218. public String getOrderInfo(String subject, String body, String price) {
  219. // 签约合作者身份ID
  220. String orderInfo = "partner=" + "\"" + PARTNER + "\"";
  221.  
  222. // 签约卖家支付宝账号
  223. orderInfo += "&seller_id=" + "\"" + SELLER + "\"";
  224.  
  225. // 商户网站唯一订单号
  226. orderInfo += "&out_trade_no=" + "\"" + getOutTradeNo() + "\"";
  227.  
  228. // 商品名称
  229. orderInfo += "&subject=" + "\"" + subject + "\"";
  230.  
  231. // 商品详情
  232. orderInfo += "&body=" + "\"" + body + "\"";
  233.  
  234. // 商品金额
  235. orderInfo += "&total_fee=" + "\"" + price + "\"";
  236.  
  237. // 服务器异步通知页面路径
  238. orderInfo += "&notify_url=" + "\"" + "http://notify.msp.hk/notify.htm"
  239. + "\"";
  240.  
  241. // 服务接口名称, 固定值
  242. orderInfo += "&service=\"mobile.securitypay.pay\"";
  243.  
  244. // 支付类型, 固定值
  245. orderInfo += "&payment_type=\"1\"";
  246.  
  247. // 参数编码, 固定值
  248. orderInfo += "&_input_charset=\"utf-8\"";
  249.  
  250. // 设置未付款交易的超时时间
  251. // 默认30分钟,一旦超时,该笔交易就会自动被关闭。
  252. // 取值范围:1m~15d。
  253. // m-分钟,h-小时,d-天,1c-当天(无论交易何时创建,都在0点关闭)。
  254. // 该参数数值不接受小数点,如1.5h,可转换为90m。
  255. orderInfo += "&it_b_pay=\"30m\"";
  256.  
  257. // extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付
  258. // orderInfo += "&extern_token=" + "\"" + extern_token + "\"";
  259.  
  260. // 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空
  261. orderInfo += "&return_url=\"m.alipay.com\"";
  262.  
  263. // 调用银行卡支付,需配置此参数,参与签名, 固定值 (需要签约《无线银行卡快捷支付》才能使用)
  264. // orderInfo += "&paymethod=\"expressGateway\"";
  265.  
  266. return orderInfo;
  267. }
  268.  
  269. /**
  270. * get the out_trade_no for an order. 生成商户订单号,该值在商户端应保持唯一(可自定义格式规范)
  271. *
  272. */
  273. public String getOutTradeNo() {
  274. SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss",
  275. Locale.getDefault());
  276. Date date = new Date();
  277. String key = format.format(date);
  278.  
  279. Random r = new Random();
  280. key = key + r.nextInt();
  281. key = key.substring(0, 15);
  282. return key;
  283. }
  284.  
  285. /**
  286. * sign the order info. 对订单信息进行签名
  287. *
  288. * @param content
  289. * 待签名订单信息
  290. */
  291. public String sign(String content) {
  292. return SignUtils.sign(content, RSA_PRIVATE);
  293. }
  294.  
  295. /**
  296. * get the sign type we use. 获取签名方式
  297. *
  298. */
  299. public String getSignType() {
  300. return "sign_type=\"RSA\"";
  301. }
  302.  
  303. }

还有支付宝封装好的几个java文件,我把它们跟HelloCpp.java文件放到了同一个包中,它们分别是Base64.java,PayResult.java,SignUtils.java,源码如下:

(1)Base64.java文件源码

  1. package org.cocos2dx.hellocpp2;
  2.  
  3. public final class Base64 {
  4.  
  5. private static final int BASELENGTH = 128;
  6. private static final int LOOKUPLENGTH = 64;
  7. private static final int TWENTYFOURBITGROUP = 24;
  8. private static final int EIGHTBIT = 8;
  9. private static final int SIXTEENBIT = 16;
  10. private static final int FOURBYTE = 4;
  11. private static final int SIGN = -128;
  12. private static char PAD = '=';
  13. private static byte[] base64Alphabet = new byte[BASELENGTH];
  14. private static char[] lookUpBase64Alphabet = new char[LOOKUPLENGTH];
  15.  
  16. static {
  17. for (int i = 0; i < BASELENGTH; ++i) {
  18. base64Alphabet[i] = -1;
  19. }
  20. for (int i = 'Z'; i >= 'A'; i--) {
  21. base64Alphabet[i] = (byte) (i - 'A');
  22. }
  23. for (int i = 'z'; i >= 'a'; i--) {
  24. base64Alphabet[i] = (byte) (i - 'a' + 26);
  25. }
  26.  
  27. for (int i = '9'; i >= '0'; i--) {
  28. base64Alphabet[i] = (byte) (i - '0' + 52);
  29. }
  30.  
  31. base64Alphabet['+'] = 62;
  32. base64Alphabet['/'] = 63;
  33.  
  34. for (int i = 0; i <= 25; i++) {
  35. lookUpBase64Alphabet[i] = (char) ('A' + i);
  36. }
  37.  
  38. for (int i = 26, j = 0; i <= 51; i++, j++) {
  39. lookUpBase64Alphabet[i] = (char) ('a' + j);
  40. }
  41.  
  42. for (int i = 52, j = 0; i <= 61; i++, j++) {
  43. lookUpBase64Alphabet[i] = (char) ('0' + j);
  44. }
  45. lookUpBase64Alphabet[62] = (char) '+';
  46. lookUpBase64Alphabet[63] = (char) '/';
  47.  
  48. }
  49.  
  50. private static boolean isWhiteSpace(char octect) {
  51. return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9);
  52. }
  53.  
  54. private static boolean isPad(char octect) {
  55. return (octect == PAD);
  56. }
  57.  
  58. private static boolean isData(char octect) {
  59. return (octect < BASELENGTH && base64Alphabet[octect] != -1);
  60. }
  61.  
  62. /**
  63. * Encodes hex octects into Base64
  64. *
  65. * @param binaryData
  66. * Array containing binaryData
  67. * @return Encoded Base64 array
  68. */
  69. public static String encode(byte[] binaryData) {
  70.  
  71. if (binaryData == null) {
  72. return null;
  73. }
  74.  
  75. int lengthDataBits = binaryData.length * EIGHTBIT;
  76. if (lengthDataBits == 0) {
  77. return "";
  78. }
  79.  
  80. int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP;
  81. int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP;
  82. int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1
  83. : numberTriplets;
  84. char encodedData[] = null;
  85.  
  86. encodedData = new char[numberQuartet * 4];
  87.  
  88. byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0;
  89.  
  90. int encodedIndex = 0;
  91. int dataIndex = 0;
  92.  
  93. for (int i = 0; i < numberTriplets; i++) {
  94. b1 = binaryData[dataIndex++];
  95. b2 = binaryData[dataIndex++];
  96. b3 = binaryData[dataIndex++];
  97.  
  98. l = (byte) (b2 & 0x0f);
  99. k = (byte) (b1 & 0x03);
  100.  
  101. byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2)
  102. : (byte) ((b1) >> 2 ^ 0xc0);
  103. byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4)
  104. : (byte) ((b2) >> 4 ^ 0xf0);
  105. byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6)
  106. : (byte) ((b3) >> 6 ^ 0xfc);
  107.  
  108. encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
  109. encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)];
  110. encodedData[encodedIndex++] = lookUpBase64Alphabet[(l << 2) | val3];
  111. encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f];
  112. }
  113.  
  114. // form integral number of 6-bit groups
  115. if (fewerThan24bits == EIGHTBIT) {
  116. b1 = binaryData[dataIndex];
  117. k = (byte) (b1 & 0x03);
  118.  
  119. byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2)
  120. : (byte) ((b1) >> 2 ^ 0xc0);
  121. encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
  122. encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4];
  123. encodedData[encodedIndex++] = PAD;
  124. encodedData[encodedIndex++] = PAD;
  125. } else if (fewerThan24bits == SIXTEENBIT) {
  126. b1 = binaryData[dataIndex];
  127. b2 = binaryData[dataIndex + 1];
  128. l = (byte) (b2 & 0x0f);
  129. k = (byte) (b1 & 0x03);
  130.  
  131. byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2)
  132. : (byte) ((b1) >> 2 ^ 0xc0);
  133. byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4)
  134. : (byte) ((b2) >> 4 ^ 0xf0);
  135.  
  136. encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
  137. encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)];
  138. encodedData[encodedIndex++] = lookUpBase64Alphabet[l << 2];
  139. encodedData[encodedIndex++] = PAD;
  140. }
  141.  
  142. return new String(encodedData);
  143. }
  144.  
  145. /**
  146. * Decodes Base64 data into octects
  147. *
  148. * @param encoded
  149. * string containing Base64 data
  150. * @return Array containind decoded data.
  151. */
  152. public static byte[] decode(String encoded) {
  153.  
  154. if (encoded == null) {
  155. return null;
  156. }
  157.  
  158. char[] base64Data = encoded.toCharArray();
  159. // remove white spaces
  160. int len = removeWhiteSpace(base64Data);
  161.  
  162. if (len % FOURBYTE != 0) {
  163. return null;// should be divisible by four
  164. }
  165.  
  166. int numberQuadruple = (len / FOURBYTE);
  167.  
  168. if (numberQuadruple == 0) {
  169. return new byte[0];
  170. }
  171.  
  172. byte decodedData[] = null;
  173. byte b1 = 0, b2 = 0, b3 = 0, b4 = 0;
  174. char d1 = 0, d2 = 0, d3 = 0, d4 = 0;
  175.  
  176. int i = 0;
  177. int encodedIndex = 0;
  178. int dataIndex = 0;
  179. decodedData = new byte[(numberQuadruple) * 3];
  180.  
  181. for (; i < numberQuadruple - 1; i++) {
  182.  
  183. if (!isData((d1 = base64Data[dataIndex++]))
  184. || !isData((d2 = base64Data[dataIndex++]))
  185. || !isData((d3 = base64Data[dataIndex++]))
  186. || !isData((d4 = base64Data[dataIndex++]))) {
  187. return null;
  188. }// if found "no data" just return null
  189.  
  190. b1 = base64Alphabet[d1];
  191. b2 = base64Alphabet[d2];
  192. b3 = base64Alphabet[d3];
  193. b4 = base64Alphabet[d4];
  194.  
  195. decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
  196. decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
  197. decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);
  198. }
  199.  
  200. if (!isData((d1 = base64Data[dataIndex++]))
  201. || !isData((d2 = base64Data[dataIndex++]))) {
  202. return null;// if found "no data" just return null
  203. }
  204.  
  205. b1 = base64Alphabet[d1];
  206. b2 = base64Alphabet[d2];
  207.  
  208. d3 = base64Data[dataIndex++];
  209. d4 = base64Data[dataIndex++];
  210. if (!isData((d3)) || !isData((d4))) {// Check if they are PAD characters
  211. if (isPad(d3) && isPad(d4)) {
  212. if ((b2 & 0xf) != 0)// last 4 bits should be zero
  213. {
  214. return null;
  215. }
  216. byte[] tmp = new byte[i * 3 + 1];
  217. System.arraycopy(decodedData, 0, tmp, 0, i * 3);
  218. tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);
  219. return tmp;
  220. } else if (!isPad(d3) && isPad(d4)) {
  221. b3 = base64Alphabet[d3];
  222. if ((b3 & 0x3) != 0)// last 2 bits should be zero
  223. {
  224. return null;
  225. }
  226. byte[] tmp = new byte[i * 3 + 2];
  227. System.arraycopy(decodedData, 0, tmp, 0, i * 3);
  228. tmp[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
  229. tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
  230. return tmp;
  231. } else {
  232. return null;
  233. }
  234. } else { // No PAD e.g 3cQl
  235. b3 = base64Alphabet[d3];
  236. b4 = base64Alphabet[d4];
  237. decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
  238. decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
  239. decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);
  240.  
  241. }
  242.  
  243. return decodedData;
  244. }
  245.  
  246. /**
  247. * remove WhiteSpace from MIME containing encoded Base64 data.
  248. *
  249. * @param data
  250. * the byte array of base64 data (with WS)
  251. * @return the new length
  252. */
  253. private static int removeWhiteSpace(char[] data) {
  254. if (data == null) {
  255. return 0;
  256. }
  257.  
  258. // count characters that's not whitespace
  259. int newSize = 0;
  260. int len = data.length;
  261. for (int i = 0; i < len; i++) {
  262. if (!isWhiteSpace(data[i])) {
  263. data[newSize++] = data[i];
  264. }
  265. }
  266. return newSize;
  267. }
  268. }

(2)PayResult.java文件源码

  1. package org.cocos2dx.hellocpp2;
  2.  
  3. import android.text.TextUtils;
  4.  
  5. public class PayResult {
  6. private String resultStatus;
  7. private String result;
  8. private String memo;
  9.  
  10. public PayResult(String rawResult) {
  11.  
  12. if (TextUtils.isEmpty(rawResult))
  13. return;
  14.  
  15. String[] resultParams = rawResult.split(";");
  16. for (String resultParam : resultParams) {
  17. if (resultParam.startsWith("resultStatus")) {
  18. resultStatus = gatValue(resultParam, "resultStatus");
  19. }
  20. if (resultParam.startsWith("result")) {
  21. result = gatValue(resultParam, "result");
  22. }
  23. if (resultParam.startsWith("memo")) {
  24. memo = gatValue(resultParam, "memo");
  25. }
  26. }
  27. }
  28.  
  29. @Override
  30. public String toString() {
  31. return "resultStatus={" + resultStatus + "};memo={" + memo
  32. + "};result={" + result + "}";
  33. }
  34.  
  35. private String gatValue(String content, String key) {
  36. String prefix = key + "={";
  37. return content.substring(content.indexOf(prefix) + prefix.length(),
  38. content.lastIndexOf("}"));
  39. }
  40.  
  41. /**
  42. * @return the resultStatus
  43. */
  44. public String getResultStatus() {
  45. return resultStatus;
  46. }
  47.  
  48. /**
  49. * @return the memo
  50. */
  51. public String getMemo() {
  52. return memo;
  53. }
  54.  
  55. /**
  56. * @return the result
  57. */
  58. public String getResult() {
  59. return result;
  60. }
  61. }

(3)SignUtils.java文件源码

  1. package org.cocos2dx.hellocpp2;
  2.  
  3. import java.security.KeyFactory;
  4. import java.security.PrivateKey;
  5. import java.security.spec.PKCS8EncodedKeySpec;
  6.  
  7. public class SignUtils {
  8.  
  9. private static final String ALGORITHM = "RSA";
  10.  
  11. private static final String SIGN_ALGORITHMS = "SHA1WithRSA";
  12.  
  13. private static final String DEFAULT_CHARSET = "UTF-8";
  14.  
  15. public static String sign(String content, String privateKey) {
  16. try {
  17. PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(
  18. Base64.decode(privateKey));
  19. //KeyFactory keyf = KeyFactory.getInstance(ALGORITHM);
  20. KeyFactory keyf = KeyFactory.getInstance(ALGORITHM, "BC");
  21. PrivateKey priKey = keyf.generatePrivate(priPKCS8);
  22.  
  23. java.security.Signature signature = java.security.Signature
  24. .getInstance(SIGN_ALGORITHMS);
  25.  
  26. signature.initSign(priKey);
  27. signature.update(content.getBytes(DEFAULT_CHARSET));
  28.  
  29. byte[] signed = signature.sign();
  30.  
  31. return Base64.encode(signed);
  32. } catch (Exception e) {
  33. e.printStackTrace();
  34. }
  35.  
  36. return null;
  37. }
  38.  
  39. }

cocos2d-x android工程接入第三方支付宝SDK的更多相关文章

  1. cocos2d-x C++ iOS工程集成第三方支付宝支付功能

      一.在支付宝开放平台下载支付宝SDK(https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.WWgVz8&tr ...

  2. 使用Tornado异步接入第三方(支付宝)支付

    目前国内比较流行的第三方支付主要有支付宝和微信支付,博主最近研究了下如何用Python接入支付宝支付,这里我以Tornado作为web框架,接入支付宝构造支付接口. 使用Tornado异步接入支付宝支 ...

  3. Android应用接入第三方登陆之新浪微博

    众所周知,移动互联网在这几年经历了蓬勃发展,到目前为止,移动互联网发展仍然很强劲.其中移动设备系统以android占据主导地位,之前是加拿大的黑莓系统占据主导,但后来随着android系统的问世,黑莓 ...

  4. PC、h5项目接入第三方支付宝扫码登录、扫码付款

    首先介绍一下pc项目接入支付宝扫码支付. 1.pc.移动接入支付宝扫码支付. 其实这个逻辑很简单,前端所需要处理的不是很多,后台会给一个连接,前端只需要将要支付的订单id拼接在这个连接上,然后打开跳转 ...

  5. Unity3D如何接入第三方的SDK - iOS篇

    来源:http://blog.csdn.net/smlisi2/article/details/8786485 授人以鱼,不如授人以渔”,以UNITY3D调用iOS版的91SDK为例,利用C# / C ...

  6. 为Android游戏接入第三方登录功能

    1. “游戏客户端”调用“SDK客户端”的登录功能向“SDK服务端”进行身份认证 2. 验证通过后,“游戏客户端”可得到用户信息,根据游戏逻辑可将用户信息传给“游戏服务器”进行验证 3. “游戏服务器 ...

  7. cocos2dx工程中接入支付宝sdk

    1. 首先去支付宝官网下载开发者文档 2. 然后按着开发者文档将支付宝的sdk导入到你的工程中,并关联到工程中,步骤入下图: (1)将从支付宝官方网站获得的支付宝的sdk的jar包拷贝到工程中的lib ...

  8. unity工程接入Android sdk后真机测试解锁屏后退出的解决

    unity工程接入如91.移动支付等Android sdk后,真机运行尤其是在4.0+以上坏境,往往会出现解锁屏后退出的情况,解决办法如下: 可以在AndroidManifest.xml中所有的con ...

  9. Android支付接入(一):支付宝

    原地址:http://blog.csdn.net/simdanfeg/article/details/9011603 转载之前我想深深地感谢屌丝哥 相信相同过App获取利润的都会需要接入计费SDK,下 ...

随机推荐

  1. 洛谷P1147 连续自然数和【二分】

    题目:https://www.luogu.org/problemnew/show/P1147 题意: 给定一个数m,问有多少个数对$(i,j)$,使得$i$到$j$区间的所有整数之和为m.输出所有的解 ...

  2. .NET Core 中依赖注入 AutoMapper 小记

    最近在 review 代码时发现同事没有像其他项目那样使用 AutoMapper.Mapper.Initialize() 静态方法配置映射,而是使用了依赖注入 IMapper 接口的方式 servic ...

  3. linux下升级gcc版本(gcc-7)

    ubuntu16.04的自带gcc版本为gcc-5,因为安装pl-slam的需要升级到gcc-7,可以通过以下命令查看你的gcc版本 gcc --version 通过apt工具对gcc进行升级 sud ...

  4. MySQL5.6的4个自带库详解

    MySQL5.6的4个自带库详解 1.information_schema详细介绍: information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式.什么是元数据呢?元数 ...

  5. [No0000C3]StarUML2 全平台破解方法

    首先,找到安装目录下的"LicenseManagerDomain.js"文件,路径"StarUML\www\license\node\LicenseManagerDoma ...

  6. JavaScript中的Array类型详解

    与其他语言中的数组的区别: 1.JavaScript数组的每一项都可以保存任何类型的数据,一个数组的数组元素可以是不同类型的数据. 2.数组的大小是动态调整的,可以随着数据的添加自动的增长. 1.两种 ...

  7. EM学习-思想和代码

    EM算法的简明实现 当然是教学用的简明实现了,这份实现是针对双硬币模型的. 双硬币模型 假设有两枚硬币A.B,以相同的概率随机选择一个硬币,进行如下的抛硬币实验:共做5次实验,每次实验独立的抛十次,结 ...

  8. 类Unix如何查看mysql的配置文件my.cnf

    mysql 配置文件 my.cnf是MySQL启动时加载的配置文件,一般会放在MySQL的安装目录中,用户也可以放在其他目录加载. 安装MySQL后,系统中会有多个my.cnf文件,有些是用户测试的. ...

  9. textfield内边距

    使用QMUITextField self.inputTf.textInset = UIEdgeInsetsMake(0, -6, 0, 10);

  10. ubuntu物理机上搭建Kubernetes集群 -- 准备

    准备工作 1.kubernetes架构 2.三台ubuntu主机: 操作系统:ubuntu-16.04.1-server-amd64 docker: 1.安装 使用命令 sudo apt-get in ...