浅谈Android支付宝快捷支付
2016-04-30 11:59
555 查看
1.在APP中选购商品
2.生成支付宝支付订单
3.提交订单
4.输入支付密码进行支付
5.支付成功后通知商户后台
准备:
申请支付宝商家ID
公司
个体工商户
商户ID
商户收款的账号
商户私钥
与银联POS支付不同的是,支付宝快捷支付手机终端没有安装支付宝也能支付,这些jar包就相当于一个支付宝客户端的核心模块(如果安装的话也会启动app,没安装的话启动H5进行支付)。
我们使用时核心代码如下
import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Random; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.text.TextUtils; import android.view.View; import android.widget.TextView; import android.widget.Toast; import com.alipay.sdk.app.PayTask; import com.aplipay.utils.Constants; import com.aplipay.utils.PayResult; import com.aplipay.utils.SignUtils; public class PayActivity extends Activity { //商户ID public static final String PARTNER = Constants.PARTNER; //商户收款账号 public static final String SELLER = Constants.SELLER; //商户私钥 //私钥用于对数据进行签名加密 //公钥用于对签名进行验证 public static final String RSA_PRIVATE = Constants.RSA_PRIVATE; private String name; private String price; private String desc; private final static int MESSAGE_PAY = 1; private Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { switch (msg.what) { case MESSAGE_PAY: String result = (String) msg.obj; PayResult payResult = new PayResult(result); //支付状态码 String resultStatus = payResult.getResultStatus(); if (TextUtils.equals(resultStatus, "9000")) { Toast.makeText(PayActivity.this, "支付成功", Toast.LENGTH_SHORT).show(); }else if (TextUtils.equals(resultStatus, "8000")) { Toast.makeText(PayActivity.this, "支付结果确认中", Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(PayActivity.this, "支付失败", Toast.LENGTH_SHORT).show(); } break; default: break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.pay); //获取商品的详细信息 Intent intent = getIntent(); name = intent.getStringExtra("name"); price = intent.getStringExtra("price"); desc = intent.getStringExtra("desc"); TextView product_name = (TextView) findViewById(R.id.product_name); TextView product_price = (TextView) findViewById(R.id.product_price); TextView product_desc = (TextView) findViewById(R.id.product_desc); product_name.setText(name); product_price.setText(price); product_desc.setText(desc); } //支付 public void pay(View btn){ //1.构建订单数据 String orderInfo = getOrderInfo(name, desc, price); //2.对订单进行签名 String sign = sign(orderInfo); try { //转码 sign = URLEncoder.encode(sign, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } //3.构建一个符合支付宝参数规范的订单数据 final String payInfo = orderInfo + "&sign=\""+sign +"\"&sign_type=\"RSA\"" ; //4.调用支付接口 new Thread(){ public void run() { //支付任务 PayTask task = new PayTask(PayActivity.this); String result = task.pay(payInfo); //按照支付宝的规则进行支付结果的解析 Message msg = handler.obtainMessage(MESSAGE_PAY); msg.obj = result; handler.sendMessage(msg); } }.start(); //5.处理支付结果 } /** * 对订单进行签名 * @param orderInfo * @return */ private String sign(String orderInfo) { return SignUtils.sign(orderInfo, RSA_PRIVATE); } /** * 构建订单信息 * @param subject 商品名称 * @param body 商品详情 * @param price 商品金额 * @return */ public String getOrderInfo(String subject, String body, String price) { // 签约合作者身份ID String orderInfo = "partner=" + "\"" + PARTNER + "\""; // 签约卖家支付宝账号 orderInfo += "&seller_id=" + "\"" + SELLER + "\""; // 商户网站唯一订单号 orderInfo += "&out_trade_no=" + "\"" + getOutTradeNo() + "\""; // 商品名称 orderInfo += "&subject=" + "\"" + subject + "\""; // 商品详情 orderInfo += "&body=" + "\"" + body + "\""; // 商品金额 orderInfo += "&total_fee=" + "\"" + price + "\""; // 服务器异步通知页面路径 orderInfo += "¬ify_url=" + "\"" + "http://notify.msp.hk/notify.htm" + "\""; // 服务接口名称, 固定值 orderInfo += "&service=\"mobile.securitypay.pay\""; // 支付类型, 固定值 orderInfo += "&payment_type=\"1\""; // 参数编码, 固定值 orderInfo += "&_input_charset=\"utf-8\""; // 设置未付款交易的超时时间 // 默认30分钟,一旦超时,该笔交易就会自动被关闭。 // 取值范围:1m~15d。 // 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\""; return orderInfo; } /** * 产生一个包含时间的随机的订单号 * @return */ private String getOutTradeNo() { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); Date date = new Date(); String key = sdf.format(date); Random random = new Random(); key = key + random.nextInt(); key = key.substring(0, 15); return key; } }
相关文章推荐
- Android 中的 Service 全面总结
- Android 数据存储
- Android 6.0的Launcher3的关于Hotseat的浅析
- button,android:onClick=""
- Android之Style简化代码
- 58. Android一些开发习惯总结
- 57. Android之程序调试LogCat (转)
- ListView 中嵌入GridView去滚动效果
- Android 图片操作,Image实战
- Android性能优化典范
- Android ActivityManagerService 基本构架详解
- android sdk 下各个文件夹的作用
- Android自定义视图一:扩展现有的视图,添加新的XML属性
- Android自定义视图一:扩展现有的视图,添加新的XML属性
- Android基础知识回顾
- Android应用资源
- android视频播放框架Vitamio
- 炫酷的底部菜单栏BottomBar
- PendingTransition实现炫酷的Activity切换动画
- Android Design Support Library--TextInputLayout的使用