本帖最后由 戴振良 于 2016-5-27 17:54 编辑
移动支付移动支付也称为手机支付,用户使用移动的设备,完成对所购买商品或者服务的支付功能.远程支付(网上支付,短信支付),近场支付(刷卡,滴卡,pos机) 移动支付方式: * 支付宝 * 微信 * 银联 * 百度钱包 * QQ钱包 * 财付通 * 京东支付 * 易宝支付 * 快钱支付 我们这里要学习的是支付宝支付、微信支付和银联支付。
支付流程1、浏览商品,如下: 2、把商品加入购物车,如下: 3、把购物车中的商品拿到收银台结账 ,如下:
上面3张图是现实生活中的支付流程,步骤细化后如下: 1. 浏览商品 2. 把要买的商品加入购物车 3. 把商品拿到收银台,收银人员处理商品信息 4. 告诉收银员支付方式 5. 选择支付方式进行支付 6. 处理支付结果(成功、失败、取消)
程序中的支付流程中: 1. 浏览商品 2. 把要买的商品加入购物车 3. 把购物车中的商品信息和用户信息和支付方式等信息发送到自己服务器,服务器处理商品信息生成订单,并返回”支付串”给客户端 4. 客户端拿着“支付串”,调用第三方服务(支付宝、微信、银联等)完成支付 5. 处理支付结果(成功、失败、取消) * 同步返回:支付后通知我们自己的apk * 异步通知:支付后通知我们的server
支付宝支付1. 支付宝支付流程 3. 导入支付宝Demo,并运行,提示如下:
这需要公司去申请支付宝商家账号,申请成功后即可获得partnerId(合作者id),这个直接问公司要就行了。 4. 密钥的获取,参照支付宝开发包中的openssl目录下“生成命令.txt”生成,生成我们自己的公钥和私钥,把我们的公钥提交到支付宝,支付宝再给我们返回支付宝的公钥。这一步需要先有支付宝商家账号,一般来说大家去了公司直接问公司领导要就行了。 6. 创建一个Android项目,界面如下:
activity_main.xml如下
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
- <Button
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="支付宝支付"
- android:onClick="alipay" />
- </RelativeLayout>
复制代码 MainActivity.java如下:
- public class MainActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- }
-
- public void alipay(View v) {
-
- }
- }
复制代码7. 配置支付宝开发环境: a) 把支付宝Demo中的“alipaySdk-20160516.jar”复制到我们的项目中 b) 把支付宝Demo中的清单文件中的权限复制到我们的项目中 c) 把支付宝Demo中的清单文件中声明的支付相关的Activity声明复制到我们的项目中 8. 查看支付宝Demo中的支付方法,用到我们的Demo中,如下: - public Handler mHandler = new Handler() {
- public void handleMessage(Message msg) {
- String result = (String) msg.obj;
- System.out.println(result);
- };
- };
-
- public void alipay(View v) {
- String payInfo = null;
- payByAlipay(payInfo);
- }
- private void payByAlipay(final String payInfo) {
- Runnable payRunnable = new Runnable() {
- @Override
- public void run() {
- // 构造PayTask 对象
- PayTask alipay = new PayTask(MainActivity.this);
- // 调用支付接口,获取支付结果
- String result = alipay.pay(payInfo, true);
- Message msg = new Message();
- msg.obj = result;
- mHandler.sendMessage(msg);
- }
- };
- // 必须异步调用
- Thread payThread = new Thread(payRunnable);
- payThread.start();
- }
复制代码9. 订单数据的生成和数据的签名都会放到服务器上来完成,这样安全性比较高,所以payInfo要从服务器中获取,这里使用Volley开源工具来发送网络请求,如下: - public void alipay(View v) {
- String url = "http://192.168.1.108:8080/AlipayPayDemoServer/submitOrder"; // 这个地址是我们自己写的服务器,生成支付串是由后台服务器完成的,Android客户端开发人员不需要知道它是怎么生成的,只需要发请求给服务器就行,具体需要哪些参数在真实开发中问服务器的开发人员即可。由于服务器中保存有账号、私钥等比较隐私的数据,所以这里就不把服务器发给大家了,等到以后我们公司申请了可以让广域网访问的服务器之后,再把地址发给大家,大家就改一下ip就行,这里的ip是电脑本机ip的地址,只能在我自己的电脑中管用。
- Listener<String> listener = new Listener<String>() {
- @Override
- public void onResponse(String response) {
- System.out.println("response = " + response);
- String payInfo = response;
- payByAlipay(payInfo);
- }
- };
- ErrorListener errorListener = new ErrorListener() {
- @Override
- public void onErrorResponse(VolleyError error) {
- Log.i("MainActivity", "请求出错了", error);
- }
- };
- Request<String> request = new StringRequest(Method.POST, url, listener, errorListener) {
- @Override
- protected Map<String, String> getParams() throws AuthFailureError {
- Map<String, String> params = new HashMap<String, String>();
- params.put("productName", "Iphone8");
- params.put("productDesc", "好手机不多说");
- params.put("productPrice", "0.01");
- return params;
- }
- };
- Volley.newRequestQueue(this).add(request);
- }
复制代码10. 运行项目,完成支付。并查看打印的Log,从服务器获取的支付信息如下:
提交给支付宝支付插件进行支付的数据:
- partner="2088221626451032"&
- amp;seller_id="3393900637@qq.com"&out_trade_no="0525133339-1642"&
- amp;subject="Iphone8"&body="好手机不多说"&total_fee="0.01"
- ¬ify_url="http://notify.msp.hk/notify.htm"&service="mobile.securitypay.pay"&payment_type="1"&_input_charset="utf-8"&it_b_pay="30m"&return_url="m.alipay.com"&sign="crGQoAbmCuVa0GEIpH8GBZdHfXw%2BE5pUvoCcHlSJyUm9pZUcVpGLrQ3XHF4ZP8QL5uhntpeAjrBqsEAI18hvG8jOuiq6aYaxdpKkRX4DKAmLKmPbO0TiXVYLren%2BrNhwuBH8EvFQiXGfRCVXjxKBk9Z0YmgpeHExBZ%2Bhsgvr1tY%3D"&sign_type="RSA"
复制代码 这个数据里面包括商家收款账号、订单号、产品名称、产品价格、通知商家支付结果的后台地址、数据签名等等信息。
支付宝支付成功后返回给我们的支付结果数据: - resultStatus=
- {9000};memo={处理成功};result={partner="2088221626451032"&
- seller_id="3393900637@qq.com"&out_trade_no="0525133339-1642"&
- subject="Iphone8"&body="好手机不多说"&total_fee="0.01"
- ¬ify_url="http://notify.msp.hk/notify.htm"&service="mobile.securitypay.pay"&payment_type="1"&_input_charset="utf-8"&it_b_pay="30m"&return_url="m.alipay.com"&success="true"&sign_type="RSA"&sign="JVIrthJVAywrB1u1P77FKPwTJIIGcLpeQ3U3QNwUJMO2vXgUk1VfJBAhuYiUbu5Ewz5ZglFyB/1eSmOH4W1A3F3JDjmuA2aeQrO3AChFkz1LupeWn5L+g72ZsSjiHV3BSjg75TcaybEw0r3fRFQr8jrl2kcLugE5PvBqv4vsDHE="}
复制代码 11. 检查支付结果,上面的支付宝Demo的检查结果是使用了支付宝同步返回结果,真实开发应该要再去查询我们自己服务器的结果,以自己服务器的结果为准。
|