赞
踩
现在的支付潮流莫过于微信跟支付宝了,最近我们项目涉及到会员需求,就用到微信支付跟支付宝支付,说实话接入之前会觉得这个复杂,等真正去动手实践的时候才觉得狠简单,真的狠简单。从接入到支付一步到位,Run完直接调起了微信跟支付宝。接入前也看了这两个支付的详细接入文档,但是看是一码事,做也是一码事。所以实践很重要。
1.如果你已经成功集成了微信登录和分享,直接用你的 libammsdk.jar和 WECHAT_APP_ID就可以了, 那么下面帮你快速集成微信支付。
2.接入前可以看看上面链接的文档,不过微信官方的文档写的不够好,好多开发者吐槽,至今也没改善点啥。
3.好了直接说接入,接入微信支付SDK前准备下面三个东西,如果你集成了微信分享,登录那只需要一个 WXPayEntryActivity 类就行了
① 微信支付的APPID
② 微信支付依赖包 -------- libammsdk.jar
③ 一个Activity类 ----------- WXPayEntryActivity
4、WXPayEntryActivity中的布局是可以自定义的,如果你不需要展示什么布局,而是要跳转页面,把这段代码删除即可
- /**
- * -Created by Luke on 2017/2/14.
- */
- public class WXPayEntryActivity extends AppCompatActivity {
- private static final String TAG = WXPayEntryActivity.class.getSimpleName();
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // setContentView(R.layout.pay_result);
- BaseApplication.api.handleIntent(getIntent(), this);
- }
- }
- WECHAT_APP_ID 已经在BaseApplication中定义了 在这里不需要再写
5.下面是回调的逻辑,官方是这样的图
我这边就简单的演示下支付成功的地方
- @Override
- public void onResp(BaseResp resp) {
-
- LogUtil.d(TAG, "Luke = " + resp.toString());
-
- if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
- int code = resp.errCode;
- switch (code) {
- case 0:
- ToastUtil.show("支付成功");
- break;
- case -1:
- ToastUtil.show("支付失败");
- finish();
- break;
- case -2:
- ToastUtil.show("支付取消");
- finish();
- break;
- default:
- ToastUtil.show("支付失败");
- setResult(RESULT_OK);
- finish();
- break;
- }
- }
- }
接下来咱就把这个WXPayEntryActivity放在清单manifest文件里面注册,然后加上exported属性,设置为true:
<activity android:name=".wxapi.WXPayEntryActivity" android:exported="true" android:launchMode="singleTop" android:theme="@style/Theme.AppCompat.NoActionBar"/>
6.这个类中的其余的回调方法,我们都不需要去操作。然后我们就可以开始支付了,蛮简单
- //PrePayWeChatEntity 服务器返回给我们微信支付的参数
-
- private void WeChatPay(PrePayWeChatEntity data) {
- if (null == data) {
- //判断是否为空。丢一个toast,给个提示。比如服务器异常,错误啥的
- return;
- }
-
- IWXAPI api = WXAPIFactory.createWXAPI(this, data.getAppid());
-
- if (!isWXAppInstalledAndSupported(api)) {
- // throw new WeChartNoFoundException();
- ToastUtil.show(getString(R.string.text_uninstalled_wchat));
-
- return;
- }
-
- //data 根据服务器返回的json数据创建的实体类对象
- PayReq req = new PayReq();
-
- req.appId = data.getAppid();
-
- req.partnerId = data.getPartnerid();
-
- req.prepayId = data.getPrepayid();
-
- req.packageValue = data.getPkgstr();
-
- req.nonceStr = data.getNoncestr();
-
- req.timeStamp = data.getTimestamp();
-
- req.sign = data.getSign();
-
- api.registerApp(data.getAppid());
-
- //发起请求
- api.sendReq(req);
- }
7.到这就是成功了,调起了微信支付。再回到 WXPayEntryActivity 中去判断成功后的动作,例如支付完成跳转一个成功的页面finish();也许是用户取消,和异常的支付失败,可以在这个逻辑中去请求订单的状态是怎么样的。
8.最后一个问题就是关于微信开放平台签名的问题。只要你手机上的程序的签名和你在微信平台登记的签名一致即可,无论是debug版本,还是release版本,都是可以的,默认都可以用release的签名
到这微信支付就愉快的结束了
1.进入支付宝开放平台,注册账户并登录。
2.登录成功后,点击管理中心创建应用(创建应用时,注意命名规范)。
下载 alipaySdk-20161222.jar 和 alipay_demo
将demo里面的alipaySdk-20161222.jar拷贝到我们工程的libs下,并添加到依赖中
跟微信一样在清单文件中注册下这两个Activity
- <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>
3.设置应用公钥
4.生成密钥
5.点击上方的支付宝密钥生成器下载下jar包之后解压
6.点击密钥生成器之后回弹出黑窗口,等几秒之后弹出生成器窗口
7.跟微信的流程相差无几。拿到价格和订单号,就可以去请求支付的地址了,然后用这些参数回调支付
- //orderNum, orderInfo, sign, signType 服务器端返回,本地生成也是OK的
- private void requestAlipay(String orderNum, String orderInfo, String sign, String signType) {
-
- try {
-
- // 对sign做URL编码
- sign = URLEncoder.encode(sign, "UTF-8");
-
- } catch (UnsupportedEncodingException e) {
- e.printStackTrace();
- }
-
- // 整的符合支付宝参数规范的订单信息
- final String payInfo = orderInfo + "&sign=\"" + sign + "\"&sign_type=\"" + signType + "\"";
-
- //lambda 此处 () -> 为lambda 表达式写法
- Runnable payRunnable = () -> {
- // 构造PayTask 对象
- PayTask payTask = new PayTask(this);
- // 调用支付接口,获取支付结果
- String result = payTask.pay(payInfo, true);
-
- if (null == result) {
- result = "out_trade_no={" + orderNum + "}";
- } else {
- result += ";out_trade_no={" + orderNum + "}";
- }
-
- Message msg = new Message();
- msg.what = SDK_PAY_FLAG;
- msg.obj = result;
- mHandler.sendMessage(msg);
- };
-
- // 必须异步调用
- Thread payThread = new Thread(payRunnable);
- payThread.start();
- }
上述生成的这些东西一般都是后台返回的,当然我们本地生成也是可以的,所以我就大概的说下流程
- @SuppressLint("HandlerLeak")
- private Handler mHandler = new Handler() {
-
- @SuppressWarnings("unused")
- public void handleMessage(Message msg) {
- switch (msg.what) {
-
- case SDK_PAY_FLAG: {
- @SuppressWarnings("unchecked")
- PayResult payResult = new PayResult((Map<String, String>) msg.obj);
- /**
- 对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
- */
- String resultInfo = payResult.getResult();// 同步返回需要验证的信息
- String resultStatus = payResult.getResultStatus();
- // 判断resultStatus 为9000则代表支付成功
- if (TextUtils.equals(resultStatus, "9000")) {
- // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
- Toast.makeText(PayDemoActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
- } else {
- // 该笔订单真实的支付结果,需要依赖服务端的异步通知。
- Toast.makeText(PayDemoActivity.this, "支付失败", Toast.LENGTH_SHORT).show();
- }
- break;
- }
-
- case SDK_AUTH_FLAG: {
- @SuppressWarnings("unchecked")
- AuthResult authResult = new AuthResult((Map<String, String>) msg.obj, true);
- String resultStatus = authResult.getResultStatus();
-
- // 判断resultStatus 为“9000”且result_code
- // 为“200”则代表授权成功,具体状态码代表含义可参考授权接口文档
- if (TextUtils.equals(resultStatus, "9000") && TextUtils.equals(authResult.getResultCode(), "200")) {
- // 获取alipay_open_id,调支付时作为参数extern_token 的value
- // 传入,则支付账户为该授权账户
- Toast.makeText(PayDemoActivity.this,
- "授权成功\n" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT)
- .show();
- } else {
- // 其他状态值则为授权失败
- Toast.makeText(PayDemoActivity.this,
- "授权失败" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT).show();
-
- }
- break;
- }
-
- default:
- break;
- }
- }
-
- ;
- };
到这儿就支付成功了,提示用户的逻辑,我们得从服务器确认是否正在支付了,查询是否支付成功的状态。根据服务器端返回的判断码来处理支付之后的一些动作。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。