支付宝支付

 
  1. package cn.woblog.testalipay;

  2.  
  3. import android.annotation.SuppressLint;

  4. import android.app.AlertDialog;

  5. import android.content.DialogInterface;

  6. import android.os.Bundle;

  7. import android.os.Handler;

  8. import android.os.Message;

  9. import android.support.v7.app.AppCompatActivity;

  10. import android.text.TextUtils;

  11. import android.view.View;

  12. import android.widget.Toast;

  13.  
  14. import com.alipay.sdk.app.PayTask;

  15.  
  16. import java.io.UnsupportedEncodingException;

  17. import java.net.URLEncoder;

  18. import java.text.SimpleDateFormat;

  19. import java.util.Date;

  20. import java.util.Locale;

  21. import java.util.Random;

  22.  
  23. import cn.woblog.testalipay.domain.PayResult;

  24. import cn.woblog.testalipay.util.SignUtils;

  25.  
  26. public class MainActivity extends AppCompatActivity {

  27. public static final String PARTNER = "";

  28.  
  29. // 商户收款账号

  30. public static final String SELLER = "";

  31.  
  32. // 商户私钥,pkcs8格式

  33. public static final String RSA_PRIVATE = "";

  34.  
  35. private static final int SDK_PAY_FLAG = 1;

  36.  
  37. @SuppressLint("HandlerLeak")

  38. private Handler mHandler = new Handler() {

  39. @SuppressWarnings("unused")

  40. public void handleMessage(Message msg) {

  41. switch (msg.what) {

  42. case SDK_PAY_FLAG: {

  43. PayResult payResult = new PayResult((String) msg.obj);

  44. /**

  45. * 同步返回的结果必须放置到服务端进行验证(验证的规则请看https://doc.open.alipay.com/doc2/

  46. * detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&

  47. * docType=1) 建议商户依赖异步通知

  48. */

  49. String resultInfo = payResult.getResult();// 同步返回需要验证的信息

  50.  
  51. String resultStatus = payResult.getResultStatus();

  52. // 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档

  53. if (TextUtils.equals(resultStatus, "9000")) {

  54. Toast.makeText(MainActivity.this, "支付成功", Toast.LENGTH_SHORT).show();

  55. } else {

  56. // 判断resultStatus 为非"9000"则代表可能支付失败

  57. // "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)

  58. if (TextUtils.equals(resultStatus, "8000")) {

  59. Toast.makeText(MainActivity.this, "支付结果确认中", Toast.LENGTH_SHORT).show();

  60.  
  61. } else {

  62. // 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误

  63. Toast.makeText(MainActivity.this, "支付失败", Toast.LENGTH_SHORT).show();

  64.  
  65. }

  66. }

  67. break;

  68. }

  69. default:

  70. break;

  71. }

  72. }

  73.  
  74. };

  75.  
  76. @Override

  77. protected void onCreate(Bundle savedInstanceState) {

  78. super.onCreate(savedInstanceState);

  79. setContentView(R.layout.activity_main);

  80. }

  81.  
  82. public void testAlipay(View view) {

  83. if (TextUtils.isEmpty(PARTNER) || TextUtils.isEmpty(RSA_PRIVATE) || TextUtils.isEmpty(SELLER)) {

  84. new AlertDialog.Builder(this).setTitle("警告").setMessage("需要配置PARTNER | RSA_PRIVATE| SELLER")

  85. .setPositiveButton("确定", new DialogInterface.OnClickListener() {

  86. public void onClick(DialogInterface dialoginterface, int i) {

  87. //

  88. finish();

  89. }

  90. }).show();

  91. return;

  92. }

  93.  
  94. String orderInfo = getOrderInfo("测试的商品", "该测试商品的详细描述", "0.01");

  95.  
  96. /**

  97. * 特别注意,这里的签名逻辑需要放在服务端,切勿将私钥泄露在代码中!

  98. */

  99. String sign = sign(orderInfo);

  100. try {

  101. /**

  102. * 仅需对sign 做URL编码

  103. */

  104. sign = URLEncoder.encode(sign, "UTF-8");

  105. } catch (UnsupportedEncodingException e) {

  106. e.printStackTrace();

  107. }

  108.  
  109. /**

  110. * 完整的符合支付宝参数规范的订单信息

  111. */

  112. final String payInfo = orderInfo + "&sign=\"" + sign + "\"&" + getSignType();

  113.  
  114. Runnable payRunnable = new Runnable() {

  115.  
  116. @Override

  117. public void run() {

  118. // 构造PayTask 对象

  119. PayTask alipay = new PayTask(MainActivity.this);

  120. // 调用支付接口,获取支付结果

  121. String result = alipay.pay(payInfo, true);

  122.  
  123. Message msg = new Message();

  124. msg.what = SDK_PAY_FLAG;

  125. msg.obj = result;

  126. mHandler.sendMessage(msg);

  127. }

  128. };

  129.  
  130. // 必须异步调用

  131. Thread payThread = new Thread(payRunnable);

  132. payThread.start();

  133. }

  134.  
  135.  
  136. /**

  137. * create the order info. 创建订单信息

  138. */

  139. private String getOrderInfo(String subject, String body, String price) {

  140.  
  141. // 签约合作者身份ID

  142. String orderInfo = "partner=" + "\"" + PARTNER + "\"";

  143.  
  144. // 签约卖家支付宝账号

  145. orderInfo += "&seller_id=" + "\"" + SELLER + "\"";

  146.  
  147. // 商户网站唯一订单号

  148. orderInfo += "&out_trade_no=" + "\"" + getOutTradeNo() + "\"";

  149.  
  150. // 商品名称

  151. orderInfo += "&subject=" + "\"" + subject + "\"";

  152.  
  153. // 商品详情

  154. orderInfo += "&body=" + "\"" + body + "\"";

  155.  
  156. // 商品金额

  157. orderInfo += "&total_fee=" + "\"" + price + "\"";

  158.  
  159. // 服务器异步通知页面路径

  160. orderInfo += "&notify_url=" + "\"" + "http://notify.msp.hk/notify.htm" + "\"";

  161.  
  162. // 服务接口名称, 固定值

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

  164.  
  165. // 支付类型, 固定值

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

  167.  
  168. // 参数编码, 固定值

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

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

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

  173. // 取值范围:1m~15d。

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

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

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

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

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

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

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

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

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

  186.  
  187. return orderInfo;

  188. }

  189.  
  190. /**

  191. * sign the order info. 对订单信息进行签名

  192. *

  193. * @param content 待签名订单信息

  194. */

  195. private String sign(String content) {

  196. return SignUtils.sign(content, RSA_PRIVATE);

  197. }

  198.  
  199. /**

  200. * get the sign type we use. 获取签名方式

  201. */

  202. private String getSignType() {

  203. return "sign_type=\"RSA\"";

  204. }

  205.  
  206. /**

  207. * get the out_trade_no for an order. 生成商户订单号,该值在商户端应保持唯一(可自定义格式规范)

  208. */

  209. private String getOutTradeNo() {

  210. SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss", Locale.getDefault());

  211. Date date = new Date();

  212. String key = format.format(date);

  213.  
  214. Random r = new Random();

  215. key = key + r.nextInt();

  216. key = key.substring(0, 15);

  217. return key;

  218. }

  219.  
  220. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值