Android接入微信支付和支付宝支付(2)
2017-10-16 22:04
429 查看
Android客户端接入支付宝支付
上一篇介绍了微信支付的接入方法,接下来就是介绍支付宝支付了,相对于微信支付,支付宝接入更加简单。目录
Android客户端接入支付宝支付
1前期准备
2生成公钥和私钥
3客户端接入思路
4代码实现
1:前期准备
蚂蚁金服注册相应的信息,用微信支付的申请信息就行,在微信支付的审核时间内申请支付宝支付,因为申请,审核都是需要大量时间的,不能浪费。2:生成公钥和私钥
下载后解压到英文目录的文件夹下比如说Alipay,这里一定要注意,目录里不能有英文,然后按照说明生成密钥就行了。将公钥上传到开放平台,公钥和私钥都要记得妥善保管,防止泄露。
3:客户端接入思路
支付宝支付接入比较简单,调用支付方法就行了。主要就是将订单信息提交后台然后后台进行签名加密工作(用验签工具验证签名是否正确),然后返回客户端经过正确签名加密的信息,客户端拿到返回的信息之后直接传入到支付方法中,拉取支付宝支付界面,根据支付宝返回的值判断支付是否成功,进行相应的操作。注意:在签名的时候要选择2048格式的签名。
4:代码实现
首先进入到支付宝开放平台,找到SDK下载下来,我们要获取demo里面的jar包,有兴趣的话也可以看下demo。1:导入jar包,首先去下载SDK
alipay_sdk里面是jar包,导入就好了
demo感兴趣的话可以看下
2:在AndroidManifest.xml中添加相应的权限和activity
<!--支付宝支付权限--> <uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/><uses-permission android:name="android.permission.READ_PHONE_STATE"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--支付宝--> <activity android:name="com.alipay.sdk.app.H5PayActivity" android:configChanges="orientation|keyboardHidden|navigation" android:exported="false" android:screenOrientation="behind"> </activity> <activity android:name="com.alipay.sdk.auth.AuthActivity" android:configChanges="orientation|keyboardHidden|navigation" android:exported="false" android:screenOrientation="behind"> </activity>
PayActivity 支付界面
import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.text.TextUtils; import android.view.KeyEvent; import android.view.View; import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.alipay.sdk.app.PayTask; import com.tencent.mm.opensdk.modelpay.PayReq; import com.tencent.mm.opensdk.openapi.IWXAPI; import com.tencent.mm.opensdk.openapi.WXAPIFactory; import org.json.JSONException; import org.json.JSONObject; import java.io.IOException; import java.util.LinkedHashMap; import java.util.Map; import butterknife.Bind; import butterknife.ButterKnife; import butterknife.OnClick; import cn.pedant.SweetAlert.SweetAlertDialog; import me.drakeet.materialdialog.MaterialDialog; import okhttp3.Call; import okhttp3.Callback; import okhttp3.FormBody; import okhttp3.RequestBody; import okhttp3.Response; import utils.ActivityCollector; import utils.GetSign; import utils.LogUtil; import utils.OkHttpUtil; import utils.Url; /** * 支付界面 */ public class PayActivity extends Activity { @Bind(R.id.leftback) ImageView leftback; @Bind(R.id.tv_title) TextView tvTitle; @Bind(R.id.go_pay) Button goPay; @Bind(R.id.alipay_layout) RelativeLayout alipayLayout; @Bind(R.id.yinlianpay_layout) RelativeLayout yinlianpayLayout; @Bind(R.id.payaway) CheckBox payaway; @Bind(R.id.order_des) //订单编号 TextView orderDes; @Bind(R.id.order_total) //订单总价 TextView orderTotal; @Bind(R.id.pay_way) CheckBox payWay; //CheckBox的选中状态 @Bind(R.id.pay_way2) CheckBox payWay2; private Context mContext; String appid = ""; String nonceStr = ""; String partnerId = ""; String timeStamp = ""; String sign = ""; String prepayId = ""; String orderNum = ""; private String WX_APPID = "你的APPID"; MaterialDialog materialDialog; boolean isChecked = false; String flag="0"; //标识 //-----------------支付宝所需参数----------------------------------- //签约合作者身份ID public static final String PARTNER = "ID"; // 商户收款账号 public static final String SELLER = "收款账号"; // 商户私钥,pkcs8格式 public static final String RSA_PRIVATE = "填入私钥"; private static final int SDK_PAY_FLAG = 1; //---------------------------------------------------- //支付宝支付重要的地方 @SuppressLint("HandlerLeak") private Handler mHandler = new Handler() { @SuppressWarnings("unused") public void handleMessage(Message msg) { switch (msg.what) { case SDK_PAY_FLAG: { PayResult payResult = new PayResult((Map<String,String>) msg.obj); /** * 同步返回的结果必须放置到服务端进行验证(验证的规则请看https://doc.open.alipay.com/doc2/ * detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665& * docType=1) 建议商户依赖异步通知 */ String resultInfo = payResult.getResult();// 同步返回需要验证的信息 String resultStatus = payResult.getResultStatus(); // 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档 LogUtil.e("resultStatus",resultStatus); if (TextUtils.equals(resultStatus, "9000")) { /** * 支付成功跳转到主界面 */ Toast.makeText(mContext, "支付成功", Toast.LENGTH_SHORT).show(); Intent intent=new Intent(mContext,AmeterGardenActivity.class); startActivity(intent); finish(); } else { // 判断resultStatus 为非"9000"则代表可能支付失败 // "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态) if (TextUtils.equals(resultStatus, "8000")) { Toast.makeText(mContext, "支付结果确认中", Toast.LENGTH_SHORT).show(); } else { // 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误 Toast.makeText(mContext, "支付失败", Toast.LENGTH_SHORT).show(); } } break; } default: break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_wx_pay); ButterKnife.bind(this); ActivityCollector.addActivity(this); mContext = this; /** * 设置标题 */ Intent intent = getIntent(); tvTitle.setText(intent.getStringExtra("title")); orderTotal.setText("¥" + intent.getStringExtra("total")); //商品总价 orderDes.setText(intent.getStringExtra("orderNum")); //订单编号 orderNum = intent.getStringExtra("orderNum"); LogUtil.e("orderNum", orderNum); /** * 微信支付的单选按钮 */ payWay.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { //do something flag ="0"; payWay2.setChecked(false); }else { flag="2"; } } }); payaway.setChecked(isChecked); /** * 支付宝支付的单选按钮 */ payWay2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked){ flag ="1"; payWay.setChecked(false); }else { flag="2"; } } }); payWay2.setChecked(isChecked); } @Override protected void onStart() { super.onStart(); } /** * 支付前的准备接口,获取支付必要参数 * 这里就是根据你选择的支付方式调不同的后台接口,获取相应的返回值 */ private void doPay(final String payway) { RequestBody requestBody = new FormBody.Builder() .add("orderNum", orderNum) .add("payWay", payway) .build(); OkHttpUtil.sendOkhttpPost(Url.doPay, requestBody, new Callback() { @Override public void onFailure(Call call, IOException e) { e.printStackTrace(); } @Override public void onResponse(Call call, Response response) throws IOException { String result = response.body().string(); LogUtil.e("result", result); JSONObject jsonObject = null; try { jsonObject = new JSONObject(result); final String code = jsonObject.getString("code"); if (code.equals("100")) { if (payway.equals("0")) { /** * 调用微信支付 */ appid = jsonObject.getJSONObject("data").getString("appid"); nonceStr = jsonObject.getJSONObject("data").getString("nonceStr"); partnerId = jsonObject.getJSONObject("data").getString("partnerId"); prepayId = jsonObject.getJSONObject("data").getString("prepayId"); timeStamp = jsonObject.getJSONObject("data").getString("timeStamp"); sign = jsonObject.getJSONObject("data").getString("sign"); wxpay(); } else { /** * 调用支付宝支付 * 拿到后台经过签名之后的值直接传到支付的方法里 */ String resultdata = jsonObject.getJSONObject("data").getString("result"); LogUtil.e("resultdata", resultdata); alipay(resultdata); } } } catch (JSONException e) { e.printStackTrace(); } } }); } //提示 private void progress() { final SweetAlertDialog dialog = new SweetAlertDialog(mContext, SweetAlertDialog.WARNING_TYPE); dialog.setTitleText("提示") .setContentText("您还未支付,确定要离开吗?") .setConfirmText("继续支付") .setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() { @Override public void onClick(SweetAlertDialog sweetAlertDialog) { dialog.dismissWithAnimation(); } }) .setCancelText("决心离开") .setCancelClickListener(new SweetAlertDialog.OnSweetClickListener() { @Override public void onClick(SweetAlertDialog sweetAlertDialog) { Intent intent = new Intent(mContext, AmeterGardenActivity.class); startActivity(intent); finish(); dialog.dismissWithAnimation(); } }) .show(); } /**重要的地方 * 支付的方法 */ private void alipay(final String orderInfo) { Runnable payRunnable = new Runnable() { @Override public void run() { // 构造PayTask 对象 PayTask alipay = new PayTask(WxPayActivity.this); // 调用支付接口,获取支付结果 Map<String,String> result = alipay.payV2(orderInfo, true); Message msg = new Message(); msg.what = SDK_PAY_FLAG; msg.obj = result; mHandler.sendMessage(msg); } }; // 必须异步调用 Thread payThread = new Thread(payRunnable); payThread.start(); } /** * 重写返回键 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { progress(); return true; } return super.onKeyDown(keyCode, event); } @OnClick({R.id.leftback, R.id.go_pay, R.id.alipay_layout, R.id.yinlianpay_layout}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.leftback: progress(); break; case R.id.go_pay: /** * 判断CheckBox的选中状态 * 选中才可以进行支付,未选中给出提示 */ if (flag.equals("0")){ doPay("0"); } if (flag.equals("1")){ doPay("1"); } if (flag.equals("2")){ Toast.makeText(mContext, "请选择一种支付方式", Toast.LENGTH_SHORT).show(); } break; } } @Override protected void onDestroy() { ActivityCollector.removeActivity(this); super.onDestroy(); } }
总结:以上就是支付宝支付的全部接入过程了,感觉比微信支付要简单很多直接调用支付方法就行了。有什么问题欢迎大家提问,我会抽时间回复。
相关文章推荐
- <android> 第三方支付sdk接入 支付宝、微信支付
- Android 支付宝支付、微信支付、银联支付 整合第三方支付接入方法
- Android 微信支付和支付宝支付 快速接入
- Android 支付宝支付、微信支付、银联支付 整合第三方支付接入方法(后台订单支付API设计)
- Android接入微信支付和支付宝支付(1)
- android,接入微信支付与支付宝支付sdk及其注意点。
- Android 微信支付和支付宝支付 快速接入
- Android开发中的第三方支付SDK的接入与使用(支付宝+微信支付+银联)
- Android微信支付和支付宝支付快速接入
- Android 支付宝支付、微信支付、银联支付 整合第三方支付接入方法(后台订单支付API设计)
- Android支付接入(一):支付宝
- Android App支付:支付宝SDK接入详细指南(附官方支付demo)
- Android支付接入(一):支付宝
- Android App支付系列(二):支付宝SDK接入详细指南(附官方支付demo)
- Android支付接入(一):支付宝
- android接入支付宝提示支付取消的方法处理
- Android App支付系列(一):微信支付接入详细指南(附官方支付demo)
- 支付宝支付和微信支付接入前要看的一些事
- Android支付接入(一):支付宝
- Android App支付系列(二):支付宝SDK接入详细指南(附官方支付demo)