支付宝介入

Android工程搭建


alipaySdk-15.5.7-20181023110917.aar 包放在您的应用工程的 libs 目录下
在根目录的build中添加

allprojects {
    repositories {

        // 添加下面的内容
        flatDir {
            dirs 'libs'
        }

        // ... jcenter() 等其他仓库
    }
}

在项目的build中添加

dependencies {

    // 添加下面的内容
    compile (name: 'alipaySdk-15.5.7-20181023110917', ext: 'aar')

    // ... 其他依赖项
}

需要在demo中粘贴的几个类
在这里插入图片描述
当前类的具体代码

package com.xinhao.takeout.controller.activity

import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.os.PersistableBundle
import android.util.Log
import com.xinhao.takeout.R
import com.xinhao.takeout.controller.presenter.BuyPersenter
import com.xinhao.takeout.model.bean.Shrimp
import android.text.TextUtils
import com.xinhao.takeout.zhifubao.AuthResult
import com.xinhao.takeout.zhifubao.PayResult
import android.annotation.SuppressLint
import android.os.Handler
import android.os.Message
import android.content.DialogInterface
import android.content.Context
import android.support.v7.app.AlertDialog
import android.widget.Button
import android.widget.Toast
import com.alipay.sdk.app.EnvUtils
import com.alipay.sdk.app.PayTask
import com.xinhao.takeout.zhifubao.util.OrderInfoUtil2_0
import kotlinx.android.synthetic.main.activity_buy2.*
import kotlin.math.floor


class BuyActivity : AppCompatActivity() {

    lateinit var title: String
    lateinit var pic: String
    var num: Int = 0
    /**
     * 用于支付宝支付业务的入参 app_id。
     */
    val APPID = "2016101000655932"

    /**
     * 用于支付宝账户登录授权业务的入参 pid。
     */
    val PID = "2088102178988547"

    /**
     * 用于支付宝账户登录授权业务的入参 target_id。
     */
    val TARGET_ID = ""

    /**
     * pkcs8 格式的商户私钥。
     *
     * 如下私钥,RSA2_PRIVATE 或者 RSA_PRIVATE 只需要填入一个,如果两个都设置了,本 Demo 将优先
     * 使用 RSA2_PRIVATE。RSA2_PRIVATE 可以保证商户交易在更加安全的环境下进行,建议商户使用
     * RSA2_PRIVATE。
     *
     * 建议使用支付宝提供的公私钥生成工具生成和获取 RSA2_PRIVATE。
     * 工具地址:https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=106097&docType=1
     */
    val RSA2_PRIVATE =
        "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCaIqHbRk5GHZzGPSpKsZhQ6wmzNOFVNMiVajbyZKNAm5XIxx643trigAJI4Z/q9/WfpDNrk3qi9LcSImQqRu2YI8oTdDpgDcZ0ihuSw6wewqimKrkNoSVJTtu08bbyOcetaOKypQ05aR2hPu5Odxp0zus4xdMBLY6Bm7fQ7w0ZtqRgOvOBGRwupoCBhD8uomxNY9qbNNyLn9KIH0CvXG0jqips9/IVFQgtYlcAK4puuIQdze7I0bI6zKO5KM+nyHWbacKxdgGI5iYA3zL1J4CHhvjYCsWZwjWEWuYZ6OqxpwkiyqVqLU7zO037cSe+lvDTSuKkV4z+wvlZMU3h3tyZAgMBAAECggEAcVIa+7LB44zr8VeQ21+co4laFVZAgLuQ6UEw6p8Q43Q/+GBk9vhppvMEOv8e6sqo3FkFsQa5uEsAuaVtTSPelOdjL1BZhrs59/597TZNOkRVZ+2rJhke57nBkFPR9F6ErrqZSUxN37KnpSA2ZpvsaIqkp5XR32DWD/Yje8n1MLxQ9HzAVZZ50PFX+82OkjuMSLED2Xx4gaWRtw5xJYuuUKbks1Ito+gmtn9C/u5Z6cl0o1Gi27wSlPnmoWMsCTolWM6NX6zPY9t0pRNPdv+Wuj9m8DE82jZj9GDnSw1ZB3NicCgbRm68zglLbb23Wx18z1KMnT4wUJbiS/h7GGRQvQKBgQDZQ9l2TwQnRoBjZdq8YrB8UmTA/afVbE2nYuaOqk5ih4loV5hEFLfJFol+fbkZm/TnkRbLy3wIWfQ5s0A/munwV82v2oS8vjknde0Mbm07oZrIucQEkob3CQ8iQOlTB4MTcyZln8ppiX7fONxKOL8OqM+6oh8tBOFiMSzIOmjJewKBgQC1nX16slnm/rZxn1VRYttpnIigTfmotrIJKN2LDGNHpmm4g3S/Cj4LdWjKUpceIpiwsrPSBC2gu/b4xJtBUwRN2rFfbSnWMkrOVD4hQ8Lkym6baabuXMKSlAdyJ20419t3+yteezoJjcTRzQwoye0Hp/Eyf28+0txlFi7O+wij+wKBgQCDuWVBG4sTHOV+XiSODu+dkH7Rm3iEJxO1pnrOiGbZyf7/KgyBSmZbHrTh4eu1oR6MvySpDof2sEMoMIuFhLDNLQ7hzYSowlP4nsDHxrOnccVcaXR0qTn20KFCTUSpOGa6BhiDiKu57MjlIZ49ycXcZ3D6YIyySME1PUc/ZlpdvQKBgQCWPhs4DaNh/QVhKbajBW0OCXjdZKRMdhcCjNP5292lwH1lLxq9j/OT9yUhewGY5HX8d1lbPCmi9txxH/RwLgU5gtmJX/1kPWa1GevsCOqJ6w1ldBmsxwAP0nX2cbdhdvEQaLCQENEKZkWUalTMyX9U/hIC/HlDN50r4xYGFJYpUQKBgQCx9BcJX293M5Smv2W5+kjwbEaupnfXmenNM9lokQlT0HjDDLuLmQunNUVn5t+lWHWy8V/xii32dUuXwfdywbBmr1Ztd/WaQPTifSErdv5ZHuEZgEYDuxLEHtAs1UODmpHjxKOymqCURRAd7lvimtF3x4x3wmQWeASefrj7D/JQdA=="
    val RSA_PRIVATE =
        "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCaIqHbRk5GHZzGPSpKsZhQ6wmzNOFVNMiVajbyZKNAm5XIxx643trigAJI4Z/q9/WfpDNrk3qi9LcSImQqRu2YI8oTdDpgDcZ0ihuSw6wewqimKrkNoSVJTtu08bbyOcetaOKypQ05aR2hPu5Odxp0zus4xdMBLY6Bm7fQ7w0ZtqRgOvOBGRwupoCBhD8uomxNY9qbNNyLn9KIH0CvXG0jqips9/IVFQgtYlcAK4puuIQdze7I0bI6zKO5KM+nyHWbacKxdgGI5iYA3zL1J4CHhvjYCsWZwjWEWuYZ6OqxpwkiyqVqLU7zO037cSe+lvDTSuKkV4z+wvlZMU3h3tyZAgMBAAECggEAcVIa+7LB44zr8VeQ21+co4laFVZAgLuQ6UEw6p8Q43Q/+GBk9vhppvMEOv8e6sqo3FkFsQa5uEsAuaVtTSPelOdjL1BZhrs59/597TZNOkRVZ+2rJhke57nBkFPR9F6ErrqZSUxN37KnpSA2ZpvsaIqkp5XR32DWD/Yje8n1MLxQ9HzAVZZ50PFX+82OkjuMSLED2Xx4gaWRtw5xJYuuUKbks1Ito+gmtn9C/u5Z6cl0o1Gi27wSlPnmoWMsCTolWM6NX6zPY9t0pRNPdv+Wuj9m8DE82jZj9GDnSw1ZB3NicCgbRm68zglLbb23Wx18z1KMnT4wUJbiS/h7GGRQvQKBgQDZQ9l2TwQnRoBjZdq8YrB8UmTA/afVbE2nYuaOqk5ih4loV5hEFLfJFol+fbkZm/TnkRbLy3wIWfQ5s0A/munwV82v2oS8vjknde0Mbm07oZrIucQEkob3CQ8iQOlTB4MTcyZln8ppiX7fONxKOL8OqM+6oh8tBOFiMSzIOmjJewKBgQC1nX16slnm/rZxn1VRYttpnIigTfmotrIJKN2LDGNHpmm4g3S/Cj4LdWjKUpceIpiwsrPSBC2gu/b4xJtBUwRN2rFfbSnWMkrOVD4hQ8Lkym6baabuXMKSlAdyJ20419t3+yteezoJjcTRzQwoye0Hp/Eyf28+0txlFi7O+wij+wKBgQCDuWVBG4sTHOV+XiSODu+dkH7Rm3iEJxO1pnrOiGbZyf7/KgyBSmZbHrTh4eu1oR6MvySpDof2sEMoMIuFhLDNLQ7hzYSowlP4nsDHxrOnccVcaXR0qTn20KFCTUSpOGa6BhiDiKu57MjlIZ49ycXcZ3D6YIyySME1PUc/ZlpdvQKBgQCWPhs4DaNh/QVhKbajBW0OCXjdZKRMdhcCjNP5292lwH1lLxq9j/OT9yUhewGY5HX8d1lbPCmi9txxH/RwLgU5gtmJX/1kPWa1GevsCOqJ6w1ldBmsxwAP0nX2cbdhdvEQaLCQENEKZkWUalTMyX9U/hIC/HlDN50r4xYGFJYpUQKBgQCx9BcJX293M5Smv2W5+kjwbEaupnfXmenNM9lokQlT0HjDDLuLmQunNUVn5t+lWHWy8V/xii32dUuXwfdywbBmr1Ztd/WaQPTifSErdv5ZHuEZgEYDuxLEHtAs1UODmpHjxKOymqCURRAd7lvimtF3x4x3wmQWeASefrj7D/JQdA=="

    private val SDK_PAY_FLAG = 1
    private val SDK_AUTH_FLAG = 2

    @SuppressLint("HandlerLeak")
    private val mHandler = object : Handler() {
        override fun handleMessage(msg: Message) {
            when (msg.what) {
                SDK_PAY_FLAG -> {
                    val payResult = PayResult(msg.obj as Map<String, String>)
                    /**
                     * 对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
                     */
                    val resultInfo = payResult.result// 同步返回需要验证的信息
                    val resultStatus = payResult.resultStatus
                    // 判断resultStatus 为9000则代表支付成功
                    if (TextUtils.equals(resultStatus, "9000")) {
                        // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
//                        showAlert(this@BuyActivity, getString(com.xinhao.takeout.R.string.pay_success) + payResult)
                        Toast.makeText(this@BuyActivity, "支付成功", Toast.LENGTH_LONG).show()
                        var intent: Intent = Intent()
                        intent.putExtra("type", "1")
                        intent.putExtra("position", position)
                        setResult(202, intent)
                        finish()
                    } else {
                        // 该笔订单真实的支付结果,需要依赖服务端的异步通知。
//                        showAlert(this@BuyActivity, getString(com.xinhao.takeout.R.string.pay_failed) + payResult)
                        Toast.makeText(this@BuyActivity, "支付成功", Toast.LENGTH_LONG).show()
                        var intent: Intent = Intent()
                        intent.putExtra("type", "1")
                        intent.putExtra("position", position)
                        setResult(202, intent)
                        finish()
                    }
                }
                SDK_AUTH_FLAG -> {
                    val authResult = AuthResult(msg.obj as Map<String, String>, true)
                    val resultStatus = authResult.resultStatus

                    // 判断resultStatus 为“9000”且result_code
                    // 为“200”则代表授权成功,具体状态码代表含义可参考授权接口文档
                    if (TextUtils.equals(resultStatus, "9000") && TextUtils.equals(authResult.resultCode, "200")) {
                        // 获取alipay_open_id,调支付时作为参数extern_token 的value
                        // 传入,则支付账户为该授权账户
//                        showAlert(this@BuyActivity, getString(com.xinhao.takeout.R.string.auth_success) + authResult)
                        Toast.makeText(this@BuyActivity, "支付成功", Toast.LENGTH_LONG).show()
                        var intent: Intent = Intent()
                        intent.putExtra("type", "1")
                        intent.putExtra("position", position)
                        setResult(202, intent)
                        finish()
                    } else {
                        // 其他状态值则为授权失败
//                        showAlert(this@BuyActivity, getString(com.xinhao.takeout.R.string.auth_failed) + authResult)
                        Toast.makeText(this@BuyActivity, "支付失败", Toast.LENGTH_LONG).show()
                        var intent: Intent = Intent()
                        intent.putExtra("type", "0")
                        intent.putExtra("position", position)
                        setResult(202, intent)
                        finish()
                    }
                }
                else -> {
                }
            }
        }
    }

    private fun showAlert(ctx: Context, info: String) {
        showAlert(ctx, info, null)
    }

    private fun showAlert(ctx: Context, info: String, onDismiss: DialogInterface.OnDismissListener?) {
        AlertDialog.Builder(ctx)
            .setMessage(info)
            .setPositiveButton(com.xinhao.takeout.R.string.confirm, null)
            .setOnDismissListener(onDismiss)
            .show()
    }

    lateinit var but_pay2: Button
    var position : Int = 0
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX)//设置沙箱环境
        setContentView(com.xinhao.takeout.R.layout.activity_buy2)
        but_pay2 = findViewById(R.id.but_pay2)

        var intent: Intent = intent
        title = intent.getStringExtra("title")
        pic = intent.getStringExtra("pic")
        num = intent.getIntExtra("num", 0)
        position = intent.getIntExtra("position", 0)
        OrderInfoUtil2_0.money = num + 0.0f

        but_pay2.setOnClickListener {
            myPay()
        }

    }

    private fun myPay() {
        if (TextUtils.isEmpty(APPID) || TextUtils.isEmpty(RSA2_PRIVATE) && TextUtils.isEmpty(RSA_PRIVATE)) {
            showAlert(this, getString(com.xinhao.takeout.R.string.error_missing_appid_rsa_private))
            return
        }

        /*
       * 这里只是为了方便直接向商户展示支付宝的整个支付流程;所以Demo中加签过程直接放在客户端完成;
       * 真实App里,privateKey等数据严禁放在客户端,加签过程务必要放在服务端完成;
       * 防止商户私密数据泄露,造成不必要的资金损失,及面临各种安全风险;
       *
       * orderInfo 的获取必须来自服务端;
       */
        val rsa2 = RSA2_PRIVATE.length > 0
        val params = OrderInfoUtil2_0.buildOrderParamMap(APPID, rsa2)
        val orderParam = OrderInfoUtil2_0.buildOrderParam(params)

        val privateKey = if (rsa2) RSA2_PRIVATE else RSA_PRIVATE
        val sign = OrderInfoUtil2_0.getSign(params, privateKey, rsa2)
        val orderInfo = "$orderParam&$sign"

        val payRunnable = Runnable {
            val alipay = PayTask(this)
            val result = alipay.payV2(orderInfo, true)
            Log.i("msp", result.toString())

            val msg = Message()
            msg.what = SDK_PAY_FLAG
            msg.obj = result
            mHandler.sendMessage(msg)
        }

        // 必须异步调用
        val payThread = Thread(payRunnable)
        payThread.start()
    }

    fun onOrderSucces(list_store: ArrayList<Shrimp.DataBean>) {


    }

    fun onOrderFail() {


    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值